安装第三方yum源
yum install -y epel-release
安装supervisor
yum install -y supervisor
supervisor配置
查看默认模板语法
echo_supervisord_conf
生成配置文件
echo_supervisord_conf > /etc/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
大意:在生产环境中 daemon
和 master_process
配置均不可使用,仅用于开发测试。
为了方便开发测试 Nginx
的 daemon
参数默认值为 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]#