解决部署的一些项目,因机器关机/重启导致项目需要手动重新启动的问题
1.安装supervisor(3种选一种)
1
2
3
4
5
6
7
8
|
#yum安装
yum install supervisor
#pip安装
pip install supervisor
#easy_install安装
easy_install supervisor
|
2.配置supervisor
1
2
3
4
5
|
#生成配置supervisor文件
echo_supervisord_conf > /etc/supervisord.conf
#创建存放配置文件目录
mkdir -p /etc/supervisord.d/conf
|
3.修改默认配置
1
2
3
|
#文件最后一行,目录修改为配置文件地址,我的.ini文件是在/etc/supervisord.d/conf/存放,而且本身配置文件也在etc中,所以目录直接写supervisord.d/conf/就可以了
[include]
files = /etc/supervisord.d/conf/*.ini
|
4.通过配置文件启动supervisor
1
2
|
#这里一定要用配置文件的绝对路径
$ supervisord -c /etc/supervisord.conf
|
5.设置开机自启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#打开文件
vim /lib/systemd/system/supervisor.service
# 输入内容
[Unit]
Description=supervisor
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
# 保存并开启
:wq
systemctl enable supervisor.service
|
6.编写要管理进程的配置文件
1
2
|
#因为我这里配置文件中通配符是以.ini结尾 所以新建的文件后缀为.ini
$ touch uwsgi.ini
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#uwsgi 配置如下
$ [program:uwsgi] #uwsgi这个名称是管理进程的别名,可以自定义
user=root #启动用户
command=/root/pyenv/myenv/bin/uwsgi --ini /root/pyenv/myenv/my_uwsgi.ini #启动的命令
directory=/root/pyenv/myenv #文件目录
autostart=true #是否跟随supervisor启动
autorestart=true #程序故障是否重启
stopasgroup=true #
startsecs=3 #启动3s后无异常判断为正常
startretries=3 #启动尝试次数
redirect_stderr=true #把stderr重定向到stdout,默认为flase
stdout_logfile=/var/log/uwsgi_out.log #标准输出日志路径 这里一定要把uwsgi本身的日志输出关掉
stderr_logfile=/var/log/uwsgi_err.log #输出错误日志路径
|
7.启动应用
1
2
3
4
5
6
7
8
|
#重启supervisor配置中的所有程序
supervisorctl reload
#查看supervisor状态 出现启动项目name即可
supervisorctl status
#重启单个应用
supervisorctl restart uwsgi
|
8.supervisor命令详解
1
2
3
4
5
6
7
8
|
supervisorctl restart <application name> #重启指定应用
supervisorctl stop <application name> #停止指定应用
supervisorctl start <application name> #启动指定应用
supervisorctl restart all #重启所有应用
supervisorctl stop all #停止所有应用
supervisorctl start all #启动所有应用
supervisorctl update #配置文件修改后可以使用该命令加载新的配置
supervisorctl reload #重新启动配置中的所有程序
|
9.其他配置
1.nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[program:nginx]
user=root
directory=/usr/local/nginx
command=/usr/local/nginx/sbin/nginx -g 'daemon off;'
autostart=true
autorestart=true
stopasgroup=true
startsecs=10
startretries=5
stopasgroup=true
redirect_stderr=true
stdout_logfile=/etc/supervisord.d/logs/nginx/nginx_out.log
stderr_logfile=/etc/supervisord.d/logs/nginx/nginx_err.log
|
2.redis
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[program:redis]
user=root
directory=/usr/local/redis
command=/usr/local/redis/bin/redis-server redis.conf
autostart=true
autorestart=true
stopasgroup=true
startsecs=10
startretries=5
stopasgroup=true
redirect_stderr=true
stdout_logfile=/home/cywhat/logs/redis/redis_out.log
stderr_logfile=/home/cywhat/logs/redis/redis_err.log
|
注意事项
使用supervisorctl status查看发现有进程被不断重启,报错如下:
1
|
#XXX(项目名) FATAL Exited too quickly (process log may have details)
|
原因:
```bash
supervisor只支持前台程序的托管到后台 #(启动前需要kill掉已经存在的进程),例如:
#uwsgi
uwsgi如果出现不断重启,一定是启动命令中加了-d的参数,去掉就好了
#redis
redis就需要把redis.conf配置文件中的daemonize设置为no
#nginx
nginx就需要在命令行后缀增加 -g ‘daemon off;’
#mongodb
mongodb如果不断重启,多半也是因为启动命令中加了后台运行的参数 & 同样的去掉就可以了