
Supervisor是一个用Python开发的进程管理工具,能够将普通命令行进程转变为后台守护进程,并监控进程状态,在异常退出时自动重启。
一、Supervisor核心特性
Supervisor具有以下显著特点:
- 简单易用:通过简单的INI风格配置文件进行配置,支持自动重启失败进程和自动日志轮换
- 集中管理:提供统一界面管理多个进程,支持本地/远程命令和Web界面控制
- 高效稳定:采用fork/exec机制启动子进程,操作系统会立即向Supervisor发送进程终止信号
- 可扩展性:提供事件通知协议和XML-RPC接口,Python开发者可轻松扩展功能
- 跨平台:支持大多数类Unix系统(Linux、Mac OS X、Solaris、FreeBSD等)
二、Supervisor核心组件
Supervisor系统由以下几个核心组件构成:
- supervisord:服务端主进程,负责启动子进程、响应客户端命令、记录日志等
- supervisorctl:命令行客户端,提供类似shell的接口管理进程
- Web界面:通过配置inet_http_server后,可通过浏览器访问管理界面
- XML-RPC接口:为Web UI提供服务的同一HTTP服务器提供的编程接口
三、安装Supervisor
Supervisor可通过多种方式安装:
基于Debian/Ubuntu系统
sudo apt-get update
sudo apt-get install supervisor
基于RPM的系统(CentOS/Fedora)
sudo yum install supervisor
# 或
sudo dnf install supervisor
使用pip安装
pip install supervisor
安装完成后,系统会生成以下关键文件:
/etc/supervisord.conf
:主配置文件/etc/supervisord.d/
:子配置文件目录/usr/bin/supervisord
:服务端程序/usr/bin/supervisorctl
:客户端程序
四、配置详解
主配置文件
生成默认配置文件模板:
echo_supervisord_conf > /etc/supervisord.conf
主配置文件主要包含以下部分:
[unix_http_server]
file=/tmp/supervisor.sock ; UNIX socket文件路径
chmod=0700 ; socket文件权限
[inet_http_server] ; Web管理界面配置
port=127.0.0.1:9001 ; 监听IP和端口
username=user ; 登录用户名
password=123 ; 登录密码
[supervisord]
logfile=/tmp/supervisord.log ; 日志文件路径 logfile_maxbytes=50MB ; 日志文件最大大小 logfile_backups=10 ; 保留的日志备份数量 loglevel=info ; 日志级别 pidfile=/tmp/supervisord.pid ; PID文件路径 nodaemon=false ; 是否以守护进程方式运行
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; 连接supervisord的URL
[include]
files = supervisord.d/*.conf ; 包含的子配置文件
程序配置
在/etc/supervisord.d/
目录下为每个程序创建单独的配置文件,例如myapp.conf
:
[program:myapp]
command=/path/to/your/program ; 要执行的命令
directory=/path/to/working/directory ; 工作目录
user=myuser ; 运行用户
autostart=true ; 是否自动启动
autorestart=true ; 是否自动重启
stderr_logfile=/var/log/myapp.err.log ; 错误日志
stdout_logfile=/var/log/myapp.out.log ; 输出日志
startsecs=10 ; 启动后稳定运行时间
startretries=3 ; 启动失败重试次数
environment=KEY="value" ; 环境变量
五、常用操作命令
- 启动supervisord服务:
supervisord -c /etc/supervisord.conf
- 重新加载配置:
supervisorctl reread
supervisorctl update
- 管理单个程序:
supervisorctl start myapp # 启动
supervisorctl stop myapp # 停止
supervisorctl restart myapp # 重启
supervisorctl status myapp # 查看状态
- 管理所有程序:
supervisorctl start all
supervisorctl stop all
supervisorctl restart all
- 查看日志:
tail -f /var/log/myapp.out.log
六、高级功能
进程组管理
Supervisor支持将相关程序分组管理:
[group:apps]
programs=app1,app2,app3
[program:app1]
command=/usr/bin/python3 app1.py
[program:app2]
command=/usr/bin/python3 app2.py
[program:app3]
command=/usr/bin/python3 app3.py
操作整个组:
supervisorctl start apps:*
supervisorctl stop apps:*
日志轮转
配置日志自动轮转:
[program:myapp]
stdout_logfile=/var/log/myapp.log
stdout_logfile_maxbytes=50MB ; 日志文件最大大小
stdout_logfile_backups=10 ; 保留的备份数量
监控报警
配置eventlistener实现异常报警:
[eventlistener:crash_alert]
command=python3 alert.py
events=PROCESS_STATE_EXITED
alert.py示例:
import sys
import requests
def alert(msg):
# 发送报警通知
url = "https://your-webhook-url"
requests.post(url, json={"text": msg})
while True:
headers = sys.stdin.readline()
payload = sys.stdin.readline()
sys.stdout.write("READY\n")
sys.stdout.flush()
if "PROCESS_STATE_EXITED" in payload:
alert("程序挂了!!!")
Docker容器中使用
在Docker容器中管理多个服务:
FROM php:7.4.33-fpm
RUN apt-get update && apt-get install -y supervisor nginx cron
COPY supervisord.conf /etc/supervisor/conf.d/
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]
supervisord.conf示例:
[supervisord]
nodaemon=true ; 容器中需要前台运行
[program:php-fpm]
command=php-fpm autostart=true autorestart=true
[program:nginx]
command=nginx -g ‘daemon off;’ autostart=true autorestart=true
[program:cron]
command=cron -f ; cron需要-f参数保持前台运行 autostart=true autorestart=true
七、常见问题解决
- 程序无法自动重启:检查
autorestart
配置是否为true - 权限问题:确保运行用户有执行程序的权限
- 日志文件不生成:检查日志文件路径是否有写入权限
- 配置修改不生效:修改配置后需要执行
supervisorctl update
- Web界面无法访问:检查
[inet_http_server]
配置和防火墙设置
八、总结
Supervisor作为一款强大的进程管理工具,具有配置简单、功能全面、稳定性高等特点,特别适合管理生产环境中的关键服务进程。合理使用Supervisor可以显著提高服务的稳定性和可靠性,减少运维工作量。