在日常开发和部署中,我们常常需要将一些后台程序(如自定义脚本、Web 服务、定时任务等)以守护进程的方式稳定运行在服务器上。为了方便地启动、停止、重启并监控这些进程,推荐使用控制程序 Supervisor —— 一个强大、轻量的进程管理工具。
一、什么是 Supervisor?
Supervisor 是一个使用 Python 开发的进程管理工具,它可以将普通的非守护进程以服务形式管理。你可以通过命令行或 Web 界面控制这些程序,常用于守护和管理自己写的服务。
使用场景
- Flask、FastAPI、Django Web 服务
- Celery、RQ 等异步任务队列
- Node.js 或 Go 编写的 API 服务
- 各类后台脚本、爬虫、数据处理服务
功能概述
- 启动/停止/重启服务
- 监控服务运行状态
- 异常退出自动重启
- 日志记录和输出重定向
- 提供命令行和 Web UI 控制面板
- 支持多服务统一管理
二、安装 Supervisor
Supervisor 支持多种安装方式,适用于 Python 虚拟环境、系统级包管理器等。
方式一:使用 pip 安装
pip install supervisor
安装完成后会自动提供一个命令行工具 echo_supervisord_conf
来生成默认配置。
方式二:使用系统包管理器
# Debian / Ubuntu
sudo apt install supervisor
# CentOS / Rocky Linux
sudo yum install supervisor
安装后会自动注册 systemd
服务,并创建默认目录 /etc/supervisor/
。
三、Supervisor 配置结构
Supervisor 通常由两个配置层组成:
- 主配置文件(``/etc/supervisor/supervisord.conf`):控制 Supervisor 自身运行
- 程序配置文件(``/etc/supervisor/conf.d/*.conf`):定义具体服务程序
1. 生成默认配置(pip 安装时)
echo_supervisord_conf > /etc/supervisord.conf
可根据需要修改其 include
部分来引用子配置:
[include] files = /etc/supervisor/conf.d/*.conf
2. 示例服务配置文件 /etc/supervisor/conf.d/myapp.conf
[program:myapp]
command=/usr/bin/python3 /path/to/app.py ; 启动命令
directory=/path/to ; 工作目录
autostart=true ; 随 supervisord 启动自动运行
autorestart=true ; 异常退出后自动重启
stderr_logfile=/var/log/myapp.err.log ; 错误日志
stdout_logfile=/var/log/myapp.out.log ; 标准输出日志
user=nobody ; 运行该进程的用户
常用字段说明:
配置项 | 说明 |
---|---|
command |
启动命令 |
directory |
程序工作目录 |
autostart |
Supervisor 启动时自动启动该程序 |
autorestart |
程序退出后是否自动重启 |
user |
以哪个用户身份运行程序 |
stdout_logfile |
标准输出日志路径 |
stderr_logfile |
标准错误日志路径(可用 redirect_stderr ) |
四、Supervisor 常用命令
启动 Supervisor 本身
# 如果使用 pip 安装:
supervisord -c /etc/supervisord.conf
# 如果使用系统安装:
sudo systemctl start supervisor
管理受管服务
# 查看所有程序状态
supervisorctl status
# 启动 / 停止 / 重启 某个程序
supervisorctl start myapp
supervisorctl stop myapp
supervisorctl restart myapp
# 重新读取配置(修改配置后需执行)
supervisorctl reread # 检查新的配置文件
supervisorctl update # 加载新的配置文件
# 重新加载所有配置(重启所有受管服务)
supervisorctl reload
五、启用 Web 管理界面
Supervisor 还提供了一个简易的 Web UI 控制面板。你可以在 supervisord.conf
中启用如下配置:
[inet_http_server]
port=*:9001 ; 或 127.0.0.1:9001
username=admin ; 登录用户名
password=123456 ; 登录密码
然后重启 Supervisor 后,访问浏览器打开http://服务器IP:9001
,即可通过 Web 页面管理所有受管进程。
Supervisor控制台
六、简单案例:部署 Flask 服务
假设你有一个 app.py
的 Flask 程序:
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "Hello, Supervisor!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
创建 Supervisor 配置文件 /etc/supervisor/conf.d/flask.conf
:
[program:flask]
command=python3 /home/ubuntu/app.py
directory=/home/ubuntu
autostart=true
autorestart=true
stdout_logfile=/var/log/flask.log
redirect_stderr=true
然后:
# 检查新的配置文件 返回 flask: available
supervisorctl reread
# 加载新的配置文件 返回 flask: added process group
supervisorctl update
# 启动flask应用 返回 flask: started
supervisorctl start flask
现在你就有一个稳定运行的 Flask 服务了!