uWSGI+nginx+supervisor管理django项目

uWSGI+nginx+supervisor管理django项目
安装第三方yum源
yum install -y epel-release
安装supervisor
yum install -y supervisor
supervisor配置

查看默认模板语法

echo_supervisord_conf

生成配置文件

echo_supervisord_conf > /etc/supervisord.conf

编译supervisord.conf文件

 将下面配置
;[include]
;files = relative/directory/*.ini
#改成 ---切记要将[include]前面注释也去掉
[include]
files = /etc/supervisor/*.conf
# 在浏览器控制进程
# 编辑supervisord.conf将下面两行注释掉
[inet_http_server]         ; inet (TCP) server disabled by default
port=0.0.0.0:9001

最终配置文件 /etc/supervisord.conf

[root@centos-1 ~]# grep -v '^;'  /etc/supervisord.conf
[unix_http_server]
file=/var/log/supervisor/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/var/log/supervisor/supervisord.log  ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info               ; (log level;default info; others: debug,warn,trace)
pidfile=/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false              ; (start in foreground if true;default false)
minfds=1024                 ; (min. avail startup file descriptors;default 1024)
minprocs=200                ; (min. avail process descriptors;default 200)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/log/supervisor/supervisor.sock ; use a unix:// URL  for a unix socket

[include]
files = /etc/supervisord.d/*.conf


配置uwsgi:
#添加配置选择
[uwsgi]
#配置和nginx连接的socket连接
socket=127.0.0.1:8007
#配置项目路径,项目的所在目录
chdir=//usr/local/mysite/
#配置wsgi接口模块文件路径,也就是wsgi.py这个文件所在的目录名
wsgi-file=mysite/wsgi.py
#配置启动的进程数
processes=4
#配置每个进程的线程数
threads=2
#配置启动管理主进程
master=True
#配置存放主进程的进程号文件
pidfile=uwsgi.pid
#配置dump日志记录(守护进程)
#daemonize=uwsgi.log

# 配置示例
[root@centos-1 gsgl]# cat uwsgi.ini
[uwsgi]
socket=127.0.0.1:8999
#socket=0.0.0.0:8999
chdir=/var/www/wwwroot/gsgl/
wsgi-file=gsgl/wsgi.py
processes=2
threads=2
master=True
pidfile=uwsgi.pid
#daemonize=uwsgi.log
py-autoreload = 1

需要注意的是如果使用supervisor进行监控时不能使用守护进程,否则supervisor启动uwsgi后无法监控uwsgi进程

通过下面的命令启动运行uwsgi

uwsgi --ini /var/www/wwwroot/website/uwsgi.ini

# 查看
ps -aux | grep uwsgi
# 看到多个uwsgi进程即没有问题
nginx配置

假设nginx安装好的路径为/usr/local/nginx,打开nginx.conf,加入以下内容:

[root@centos-1 ~]# cat /etc/nginx/conf.d/nginx.conf
server {
   listen 80;
   #server_name  website.bg9fqp.cn;
   server_name  192.168.191.186;
   charset utf-8;
   location / {
      include uwsgi_params;
      uwsgi_pass 127.0.0.1:8999;
      uwsgi_param UWSGI_SCRIPT website.wsgi;
      uwsgi_param UWSGI_CHDIR /var/www/wwwroot/website/;
   }
   location /static/ {
   alias /var/www/wwwroot/website/static/;
   }
   location /media/ {
   alias /var/www/wwwroot/website/media/;
   }
}

[root@centos-1 ~]#

测试启动nginx

systemctl enable nginx && systemctl start nginx

以上就是nginx和uwsgi的配置,接下来配置supervisor来守护Uwsgi进程,有了它,我们再也不用担心由于uwsgi进程莫名被"死掉"而引起的Django网站打不开的情况了。

配置nginx守护进程

这里有个坑

语法: daemon on | off

缺省值: on

Do not use the “daemon” and “master_process” directives in a production mode, these options are mainly used for development only. You can use daemon off

大意:在生产环境中 daemonmaster_process 配置均不可使用,仅用于开发测试。

为了方便开发测试 Nginxdaemon 参数默认值为 on

如果大家使用 Docker 看过 Nginx 镜像的 Dockerfile 你就明白这个


启动容器时直接配置了 daemon off

所以咱们在配置 supervisor 的时候需要注意啦

  • 配置解释

[program:nginx] #  设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名 我这里就叫做nginx了!
command=/usr/sbin/nginx -g 'daemon off;' # 需要执行的命令
directory=/etc/nginx # 命令执行的目录或者说执行 command 之前,先切换到工作目录 可以理解为在执行命令前会切换到这个目录 在我这基本没啥用
autostart=true #是否自动启动
autorestart=true #程序意外退出是否自动重启
redirect_stderr=true # 如果为true,则stderr的日志会被写入stdout日志文件中  理解为重定向输出的日志
priority=10 # 启动优先级
stdout_logfile=/data/logs/supervisord/nginx.log # 子进程的stdout的日志路径 输出日志文件
stderr_logfile=/data/logs/supervisord/nginx.err.log # 错误日志文件 当redirect_stderr=true。这个就不用
  • 最终配置 vi /etc/supervisord.d/nginx.conf

[root@centos-1 ~]# cat /etc/supervisord.d/nginx.conf
[program:nginx]
command=/usr/sbin/nginx -g 'daemon off;'
directory=/etc/nginx
autostart=true
autorestart=true
redirect_stderr=true
priority=10
stdout_logfile=/var/log/supervisor/nginx.log
[root@centos-1 ~]#
配置uwsgi守护进程

在 /etc/supervisor/文件夹下加入需要管理的uwsgi配置文件uwsgi.conf

[root@centos-1 supervisord.d]# cat uwsgi.conf
# 加入如下配置
[program:uwsgi]
# uwsgi的启动命令
command=/var/www/env/website/bin/uwsgi --ini /var/www/wwwroot/website/uwsgi.ini
user=root
# uwsgi关闭后是否自动重启
autorestart=true
#是否随supervisor启动而启动
autostart=true
#启动失败自动重试次数,默认是 3
startretries=3
#把 stderr 重定向到 stdout,默认 false
redirect_stderr=true
#启动 5 秒后没有异常退出,就当作已经正常启动了
startsecs=5
#日志文件存放目录, 此目录需要新建
stdout_logfile=/var/log/django/supervisor.log
#是否干掉程序的所有进程(包括子进程)
stopasgroup=true
killasgroup=true
#程序启动优先级,若有多个进程管理时使用,默认-1
priority=100
[root@centos-1 supervisord.d]#
修改uwsgi配置

之前我们在uwsgi的配置文件中设置了一个日志文件保存位置的参数:

daemonize = /home/mysite_uwsgi/mysite.log

但是这个参数的配置与Supervisor的日志输出配置是有冲突的,需要注释掉它,因为在前面加个#

# daemonize = /home/mysite_uwsgi/mysite.log
最后启动supervisor
mkdir /run/supervisor/
supervisord -c /etc/supervisord.conf

systemctl enable supervisord
systemctl start supervisord

ps -aux | grep uwsgi |awk '{print $2}'|xargs kill -9

[root@centos-1 gsgl]# supervisorctl start uwsgi
uwsgi: ERROR (spawn error)
[root@centos-1 gsgl]# ps -ef |grep uws
root      2178     1  2 09:43 ?        00:00:01 /var/www/env/website/bin/uwsgi --ini /var/www/wwwroot/website/uwsgi.ini
root      2182  2178  0 09:43 ?        00:00:00 /var/www/env/website/bin/uwsgi --ini /var/www/wwwroot/website/uwsgi.ini
root      2185  2178  0 09:43 ?        00:00:00 /var/www/env/website/bin/uwsgi --ini /var/www/wwwroot/website/uwsgi.ini
root      2203  2035  0 09:44 pts/1    00:00:00 grep --color=auto uws
[root@centos-1 gsgl]# ps -ef |grep uws
root      2215  2035  0 09:44 pts/1    00:00:00 grep --color=auto uws
[root@centos-1 gsgl]# supervisorctl start uwsgi
uwsgi: started
[root@centos-1 gsgl]# supervisorctl status
uwsgi                            RUNNING   pid 2217, uptime 0:01:38
[root@centos-1 gsgl]#
修改后更新 Supervisor
/usr/bin/supervisord -c /etc/supervisord.conf

supervisorctl reread # 重新读取配置
supervisorctl update # 更新配置
supervisorctl restart nginx  # 重启 nginx
killall nginx  # 杀掉所有的 nginx 进程. 已经杀不死了 说明守护进程配置成功
查看一下状态
supervisorctl status

[root@centos-1 supervisord.d]# supervisorctl status
nginx                            RUNNING   pid 2295, uptime 0:08:58
uwsgi                            RUNNING   pid 2296, uptime 0:08:58
[root@centos-1 supervisord.d]#


下一篇: