安装supervisor
supervisor 是 Python 编写的,所以安装起来也很方便,可以直接用 pip。
# 通过python源安装
pip install supervisor
# 创建配置文件目录
mkdir /etc/supervisor
# 生成配置文件
echo_supervisord_conf > /etc/supervisord.conf
配置开机启动
配置systemctl服务
# vim /usr/lib/systemd/system/supervisor.service
[Unit]
Description=supervisor
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
重新加载配置
systemctl enable supervisor.service
systemctl daemon-reload
配置例子
[program:usercenter]
directory = /home/leon/projects/usercenter ; 程序的启动目录
command = gunicorn -w 8 -b 0.0.0.0:17510 wsgi:app ; 启动命令
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = leon ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /data/logs/usercenter_stdout.log
其中
[program:usercenter]
中的usercenter
是应用程序的唯一标识,不能重复。对该程序的所有操作(start, restart 等)都通过名字来实现。
-
Python 环境
有两种方式指定程序使用的 Python 环境:
-
command
使用绝对路径。假设使用 pyenv 来管理 Python 环境,上面例子中的 gunicorn 路径可以替换为/home/leon/.pyenv/versions/usercenter/bin/gunicorn
. 这种方式一目了然,推荐。 -
通过
environment
配置PYTHONPATH
.environment=PYTHONPATH=$PYTHONPATH:/home/leon/.pyenv/versions/usercenter/bin/
.environment
这个配置项非常有用,可以用来给程序传入环境变量。
-
-
子进程
有时候用 Supervisor 托管的程序还会有子进程(如 Tornado),如果只杀死主进程,子进程就可能变成孤儿进程。通过这两项配置来确保所有子进程都能正确停止:
stopasgroup=true killasgroup=true