Supervisor 极简入门

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>