Supervisor 通过前台运行 Nginx(-g 'daemon off;')和托管 Gunicorn 进程,实现对两者的自动拉起、日志归档与统一启停;需独立配置、设 priority 控制顺序,并重载生效。

用 Supervisor 守护 Nginx 和 Python 应用(如 Flask、Django 或 Gunicorn),本质是把关键服务变成“会自我恢复”的进程。它不替代 Nginx 或 Python 本身,而是站在上层统一监管——进程挂了自动拉起、日志集中归档、启停一键操作,真正解决“半夜被崩掉的服务叫醒”这类运维痛点。
为什么 Nginx 和 Python 都需要 Supervisor
Nginx 默认以 daemon 模式后台运行,Supervisor 无法监控后台进程;Python 应用(尤其用 flask run 或裸 python app.py 启动)一关终端就退出,也没有崩溃重试机制。两者单独部署都缺乏生产级的健壮性:
- Nginx 必须强制前台运行(
-g 'daemon off;'),才能被 Supervisor 真正“看见”和接管 - Python Web 服务推荐用 Gunicorn/uWSGI 启动,而不是开发服务器;Supervisor 直接管理 Gunicorn 进程,而非 Python 脚本本身
- 两者可独立配置、独立启停,也能通过
priority控制启动顺序(例如先启 Gunicorn,再启 Nginx)
Nginx 的 Supervisor 配置要点
在 /etc/supervisor/conf.d/nginx.conf 中写入:
[program:nginx]
command=/usr/sbin/nginx -g 'daemon off;'
autostart=true
autorestart=true
startsecs=10
startretries=3
stderr_logfile=/var/log/supervisor/nginx_error.log
stdout_logfile=/var/log/supervisor/nginx_access.log
stopasgroup=true
killasgroup=true
stopsignal=INT
立即学习“Python免费学习笔记(深入)”;
关键说明:
-
daemon off;是必须项,否则 Supervisor 认为进程已退出 -
stopasgroup和killasgroup确保 Nginx 主进程退出时,其 worker 子进程也被一并终止,避免残留 -
stopsignal=INT对应nginx -s stop的优雅关闭行为,比 TERM 更安全
Python 应用(Gunicorn)的 Supervisor 配置示例
假设你的 Flask 项目路径为 /opt/myapp,虚拟环境在 /opt/myapp/venv:
[program:myapp]
command=/opt/myapp/venv/bin/gunicorn app:app -b 127.0.0.1:8000 --workers 3 --timeout 30
directory=/opt/myapp
user=www-data
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/supervisor/myapp.log
environment=PATH="/opt/myapp/venv/bin",PYTHONPATH="/opt/myapp"
注意细节:
-
directory必须设为项目根目录,否则 Gunicorn 找不到模块 -
environment显式注入PATH和PYTHONPATH,确保虚拟环境生效 -
--workers数量建议设为 CPU 核心数 × 2 + 1,避免过载
上线后验证与日常运维
配置完记得重载 Supervisor:
sudo supervisorctl reread<br>sudo supervisorctl update<br>sudo supervisorctl status
你会看到类似输出:
nginx RUNNING pid 1234, uptime 0:05:22
myapp RUNNING pid 1235, uptime 0:05:21
常用操作:
- 查看实时日志:
sudo supervisorctl tail -f myapp stdout - 手动重启某服务:
sudo supervisorctl restart myapp - 停止 Nginx 但保留 Python 服务:
sudo supervisorctl stop nginx - 所有日志默认存于
/var/log/supervisor/,无需额外轮转配置


















