# Supervisor进程管理 ## 概述 Supervisor 是一个 Python 编写的进程管理工具,用于在 Linux 服务器上管理 Django 应用进程。它提供自动重启、日志管理、进程监控等功能,是生产环境部署的推荐方案之一。 :::tip 适用场景 - Linux 服务器直接部署(非 Docker) - 需要进程自动重启和日志轮转 - 管理多个相关进程 ::: ## 配置文件示例 ```ini ; Supervisor 进程管理配置 ; 将 command / directory 替换为实际路径后复制到 /etc/supervisor/conf.d/ [program:djangoadmin] ; 启动命令:使用 gunicorn 运行 Django WSGI 应用 command=/path/to/venv/bin/gunicorn application.wsgi:application --bind 127.0.0.1:8000 --workers 4 --timeout 120 ; 项目根目录 directory=/data/apps/DjangoAdmin_Django_EleVue ; 自动启动 autostart=true ; 异常退出后自动重启 autorestart=true ; 停止时终止子进程 stopasgroup=true killasgroup=true ; 错误输出重定向到标准输出 redirect_stderr=true ; 日志文件 stdout_logfile=/path/to/logs/supervisor.out.log ; 日志轮转:单文件最大 50MB,保留 10 个备份 stdout_logfile_maxbytes=50MB stdout_logfile_backups=10 ; 环境变量 environment=PYTHONUNBUFFERED=1,DJANGO_SETTINGS_MODULE="application.settings" ; 启动等待时间 startsecs=10 ``` :::tip 配置路径 将修改后的配置文件复制到 `/etc/supervisor/conf.d/` 目录下,需修改三处路径: ```bash # 1. 修改 command 中的虚拟环境路径和 gunicorn 路径 # 2. 修改 directory 为项目实际路径 # 3. 修改 stdout_logfile 为日志实际路径 cp deploy/supervisor.conf /etc/supervisor/conf.d/djangoadmin.conf ``` ::: ## 安装 Supervisor ```bash # Ubuntu/Debian sudo apt-get install supervisor # CentOS/RHEL sudo yum install supervisor # pip 安装 pip install supervisor ``` ## 常用命令 ### 进程管理 ```bash # 读取配置并启动进程 sudo supervisorctl reread sudo supervisorctl update # 启动进程 sudo supervisorctl start djangoadmin # 停止进程 sudo supervisorctl stop djangoadmin # 重启进程 sudo supervisorctl restart djangoadmin # 查看进程状态 sudo supervisorctl status # 停止所有进程 sudo supervisorctl stop all # 重启所有进程 sudo supervisorctl restart all ``` ### 服务管理 ```bash # 启动 Supervisor 服务 sudo systemctl start supervisord # 停止 Supervisor 服务 sudo systemctl stop supervisord # 设置开机自启 sudo systemctl enable supervisord # 查看服务状态 sudo systemctl status supervisord ``` ## Gunicorn 配置说明 生产环境推荐使用 Gunicorn 作为 WSGI 服务器: | 参数 | 说明 | 推荐值 | |:----|:----|:----| | `--bind` | 绑定地址和端口 | `127.0.0.1:8000` | | `--workers` | Worker 进程数 | `CPU核心数 * 2 + 1` | | `--timeout` | 请求超时时间(秒) | `120` | | `--max-requests` | 单个 Worker 最大请求数(防内存泄漏) | `1000` | | `--max-requests-jitter` | 最大请求随机抖动 | `100` | ```bash # 完整启动命令 gunicorn application.wsgi:application \ --bind 127.0.0.1:8000 \ --workers 4 \ --timeout 120 \ --max-requests 1000 \ --max-requests-jitter 100 ``` ## 日志轮转 Supervisor 内置日志轮转功能,通过以下配置控制: ```ini ; 单个日志文件最大 50MB stdout_logfile_maxbytes=50MB ; 保留 10 个历史日志文件 stdout_logfile_backups=10 ``` :::tip 日志文件命名 当 `stdout_logfile_maxbytes` 达到上限时,Supervisor 自动轮转: - `supervisor.out.log`(当前日志) - `supervisor.out.log.1`(上一个) - `supervisor.out.log.2`(更早的) - ...最多保留 `stdout_logfile_backups` 个 ::: ## 多进程管理 如需同时管理多个进程(如应用 + Celery Worker): ```ini [program:djangoadmin] command=/path/to/venv/bin/gunicorn application.wsgi:application --bind 127.0.0.1:8000 --workers 4 directory=/data/apps/DjangoAdmin_Django_EleVue autostart=true autorestart=true [program:djangoadmin-celery] command=/path/to/venv/bin/celery -A application worker -l info directory=/data/apps/DjangoAdmin_Django_EleVue autostart=true autorestart=true numprocs=2 ``` ## 常见问题 ### 进程启动失败 ```bash # 查看详细错误日志 sudo supervisorctl tail -f djangoadmin # 检查配置语法 sudo supervisorctl status ``` :::tip 常见原因 1. Python 虚拟环境路径错误 2. 项目目录路径错误 3. 端口被占用 4. `.env` 文件缺失或配置错误 5. Gunicorn 未安装(`pip install gunicorn`) ::: ### 进程频繁重启 ```bash # 查看退出原因 sudo supervisorctl tail djangoadmin stderr # 调整启动等待时间(给应用足够的启动时间) startsecs=10 ``` ## 总结 Supervisor 是 Linux 环境下管理 Django 进程的可靠方案,提供自动重启、日志轮转、进程监控等能力。生产环境推荐使用 Gunicorn 作为 WSGI 服务器,配合 Supervisor 管理进程。配置文件修改路径后复制到 `/etc/supervisor/conf.d/` 即可使用。