1. 前言
最近收到防疫的影响,闷在家里闲的发慌,就想在 VPS 上造一两个轮子。
造完轮子要作为后台进程部署,避免在终端退出后应用也顺带退出,这里一般可以考虑以下几种方法:
tmux
或者screen
nohup
setsid
supervisor
这里我就不一一介绍了,反正选了 supervisor 作为最后的方案。
2. 安装与配置
通过 pip 安装:
sudo pip install supervisor
supervisor 的配置文件命名为 supervisord.conf
,它为 supervisord
(supervisor 的主服务命令) 和 supervisorctl
(Supervisor 的监控管理命令)提供配置选项设置。 supervisor 并不规定配置文件 supervisord.conf
的存放位置,Supervisor 服务启动的时候默认会在:
$CWD/supervisord.conf
$CWD/etc/supervisord.conf
/etc/supervisord.conf
这几个目录位置查找配置文件 supervisord.conf
。
supervisor 也提供参数 -c
来指定配置文件的目录路径。
2.1 服务的配置文件
在终端输入 echo_supervisord_conf
命令可查看 supervisor 的默认配置的内容。
生成一份默认的配置文件:
echo_supervisord_conf > /path/to/supervisord.conf
或者直接使用下面给出的一份配置,保存为 /path/to/supervisord.conf
:
[unix_http_server]
file=/tmp/supervisor.sock
[inet_http_server]
port=0.0.0.0:9001
username=<user>
password=<password>
[supervisord]
logfile=/tmp/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/tmp/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock
[include]
files = supervisord.d/*.ini
改动主要体现为两点:
[inet_http_server]
标签指定了可以通过 web 访问 supervisor 的地址以及账户认证信息。[include]
标签来指定应用的配置信息的目录。要在建立/path/to/supervisord.d
目录来保存应用的配置文件,与supervisord.conf
文件同层级。
2.2 应用配置模版
配置文件的文件路径为:/path/to/supervisord.d/<APP_NAME>.ini
[program:<APP_NAME>]
autorestart = true
autostart = true
command = <command>
directory = <path_to_program>
environment = <key>="<value>"[,<key>="<value>"...]
killasgroup = true
loglevel = info
numprocs = 1
startsecs = 1
stderr_logfile = <path_to_err_log_file>
stdout_capture_backups = 1MB
stdout_events_enabled = false
stdout_logfile = <path_to_out_log_file>
stdout_logfile_backups = 5
stdout_logfile_maxbytes = 50MB
stopasgroup = false
stopwaitsecs = 10
3. 常用命令
# 启动 supervisor
python /usr/local/bin/supervisorctl -c /path/to/supervisord.conf
# 查看状态
supervisorctl -u <user> -p <password> status [<APP_NAME>]
# 重载配置文件
supervisorctl -u <user> -p <password> reload [<APP_NAME>]
# 重启、关闭应用
supervisorctl -u <user> -p <password> restart <APP_NAME>
supervisorctl -u <user> -p <password> stop <APP_NAME>
# tail 日志
supervisorctl -u <user> -p <password> tail <APP_NAME>