悠悠楠杉
告别手动重启!用Supervisor优雅管理PHP后台进程
为什么需要Supervisor?
最近在部署一个PHP邮件队列系统时,我遇到了典型的长时运行进程管理难题:进程莫名崩溃需要人工介入、服务器重启后需手动恢复服务、多个worker进程难以统一管理...直到发现了Supervisor这个神器,才真正体会到什么叫做"set it and forget it"的运维体验。
一、Supervisor核心优势
- 进程守护:自动重启异常退出的子进程
- 集中管理:统一启停/监控多个后台进程
- 日志集成:所有子进程日志集中处理
- 开机自启:系统重启后自动恢复服务
- Web可视化:通过web界面实时监控(可选)
二、实战安装配置
1. 基础环境准备(以Ubuntu为例)
bash
sudo apt update
sudo apt install -y supervisor
sudo systemctl enable supervisor # 设置开机自启
2. 专用配置文件创建
每个PHP项目建议单独配置,在/etc/supervisor/conf.d/
下新建配置:
ini
[program:php-worker]
command=php /path/to/your/worker.php
directory=/path/to/your
autostart=true
autorestart=true
startretries=3
user=www-data
numprocs=2 # 启动2个worker进程
process_name=%(program_name)s_%(process_num)02d
stdout_logfile=/var/log/supervisor/php-worker.log
stderr_logfile=/var/log/supervisor/php-worker-error.log
关键参数解析:
- autorestart=true
:异常退出时自动重启
- numprocs
:实现进程池模式
- user
:指定运行身份(重要安全配置)
3. 热加载配置
bash
sudo supervisorctl reread
sudo supervisorctl update
三、高级管理技巧
1. 进程状态监控
bash
sudo supervisorctl status
输出示例:php-worker:php-worker_00 RUNNING pid 1234
2. 模拟崩溃测试
php
// worker.php测试代码
if (rand(1, 10) > 8) {
exit(1); // 随机模拟崩溃
}
Supervisor会自动在1秒后重启进程(默认配置)
3. 动态扩容技巧
临时增加worker数量:
bash
sudo supervisorctl add php-worker:php-worker_02
4. 日志轮转配置
避免日志文件过大:
ini
[program:php-worker]
...
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
四、PHP最佳实践
1. 信号处理
php
pcntl_async_signals(true);
pcntl_signal(SIGTERM, function() {
// 优雅退出处理
file_put_contents('/tmp/shutdown.log', date('Y-m-d H:i:s')." Graceful shutdown\n", FILE_APPEND);
exit(0);
});
2. 内存泄漏防护
ini
[program:php-worker]
...
stopasgroup=true # 终止整个进程组
killasgroup=true
3. 多环境配置方案
通过环境变量区分:
ini
environment=APP_ENV="production"
五、避坑指南
- 权限问题:确保日志目录可写(建议
chown -R www-data:www-data /var/log/supervisor
) - 僵尸进程:定期检查
ps auxf
观察进程树 - 性能监控:配合
supervisor-top
插件查看资源占用 - 配置验证:使用
supervisorctl tail php-worker stderr
查看错误
结语
自从用上Supervisor后,我的服务器运维效率提升了至少70%。现在凌晨3点再也不会被报警短信吵醒处理崩溃的队列进程,真正实现了"部署即忘"的理想状态。对于任何需要长时间运行的PHP脚本(队列处理、WebSocket服务、定时任务等),Supervisor都应该是你的标准基础设施。
经验之谈:在生产环境运行一个月后,通过Supervisor管理的20个PHP worker进程实现了99.98%的可用性,相比之前的手动管理方式,系统稳定性提升了惊人的15倍。