Supervisor是什么?
Supervisor是一款轻量级的进程管理工具,是基于Python开发的,专门用来监控、启动、停止和重启进程。对于PHP的项目来说它最核心的作用是:
- 防止PHP脚本(比如队列消费、数据同步脚本)意外退出
- 不用手动盯着进程挂了会自动重启
- 可以统一管理多个PHP进程,再也不用记一堆的启动命令。
快速安装
Supervisor是支持Linux/Unix系统的,Windows暂时不适用(Windows 可考虑其他工具)。不同系统安装命令不一样,下面这个直接抄就行:
Ubuntu/Debian系统
# 更新软件源
sudo apt update
# 安装 Supervisor
sudo apt install -y supervisor
CentOS/RHEL系统
# 先装 epel 源(CentOS 自带源没有 Supervisor)
sudo yum install -y epel-release
# 安装 Supervisor
sudo yum install -y supervisor
验证安装安装完成后启动Supervisor服务,再检查状态:
# 启动服务
sudo systemctl start supervisord
# 设置开机自启(避免服务器重启后失效)
sudo systemctl enable supervisord
# 检查是否运行正常(出现 active(running) 就是成功)
sudo systemctl status supervisord
查看版本
supervisord --version
# 我的是4.2.2
核心配置可以让PHP进程更听话
先看主配置
Supervisor的配置分两部分,主配置(全局设置)和项目配置(单个 PHP 进程的设置)。主配置不用改太多重点是项目配置。 主配置文件路径:vi /etc/supervisord.conf,打开文件找到最后一行:
[include]
files = supervisord.d/*.ini
这行意思是所有放在 /etc/supervisord.d/ 目录下后缀为 .ini 的文件,都会被Supervisor加载。我们的PHP项目配置就放在这个目录里。
写PHP项目配置(关键步骤)
假设我们要管理一个hyperf服务(路径:/var/www/project/bin/hyperf.php),步骤如下:
- 在 /etc/supervisord.d/ 目录下新建配置文件,比如 hyperf.ini:
sudo vi /etc/supervisord.d/hyperf.ini - 粘贴以下配置(每个参数都标了注释,替换成自己的路径即可):
# 定义进程名称(自定义,唯一就行) [program:hyperf] # 关键:PHP 脚本的执行命令(先确认 PHP 路径,用 which php 可查) command=/usr/bin/php /var/www/project/bin/hyperf.php start # 脚本运行的用户(建议用 www-data 或项目所属用户,避免权限问题) user=www-data # Supervisor 启动时,自动启动这个脚本 autostart=true # 脚本意外退出后,自动重启(true 表示总是重启) autorestart=true # 脚本退出后,延迟多久重启(单位:秒);Hyperf 启动需要加载容器,建议设长一点8~10s startsecs=10 # 日志文件路径(记录脚本输出,方便排查问题) stdout_logfile=/var/log/hyperf/stdout.log stderr_logfile=/var/log/hyperf/stderr.log # 日志文件最大大小(比如 50MB,满了会自动切割) stdout_logfile_maxbytes=50MB # 日志文件保留数量(最多保留 10 个旧日志) stdout_logfile_backups=10 - 保存退出
- 让Supervisor加载新配置:
# 更新配置(加载新增的 hyperf.ini) sudo supervisorctl update # 启动刚才配置的进程(进程名就是 [program:] 后面的 hyperf) sudo supervisorctl start hyperf
实战
很多 PHP 项目会用队列比如 Redis 队列、RabbitMQ处理异步任务(比如发送短信、生成报表),但队列消费进程很容易挂。用Supervisor守护就能高枕无忧了。以Laravel队列为例,配置文件(/etc/supervisord.d/laravel_queue.ini)这样写:
[program:laravel_queue_worker]
# Laravel 队列消费命令(--daemon 表示后台运行)
command=/usr/bin/php /var/www/laravel-project/artisan queue:work redis --daemon --tries=3
user=www-data
autostart=true
autorestart=true
stdout_logfile=/var/log/laravel_queue/stdout.log
stderr_logfile=/var/log/laravel_queue/stderr.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
然后加载配置并启动:
sudo supervisorctl update
sudo supervisorctl start laravel_queue_worker
这样即使队列进程意外退出,Supervisor也会自动重启不用再手动执行 artisan queue:work 了。
常用命令
掌握几个核心命令,就能管好所有PHP进程:
# 查看所有进程状态(running 表示正常,stopped 表示停止)
sudo supervisorctl status
# 启动单个进程(替换成你的进程名)
sudo supervisorctl start php_sync_data
# 停止单个进程
sudo supervisorctl stop php_sync_data
# 重启单个进程(修改脚本后,用这个命令让脚本生效)
sudo supervisorctl restart php_sync_data
# 停止所有进程
sudo supervisorctl stop all
# 查看 Supervisor 日志(排查进程启动失败问题)
sudo tail -f /var/log/supervisor/supervisord.log
避坑指南
进程启动失败? 先看日志配置里写了 stdout_logfile 和 stderr_logfile,用 tail 命令看日志内容:
sudo tail -f /var/log/php_sync/stderr.log常见原因:PHP路径错了(用 which php 确认)、脚本权限不够(给脚本加执行权限:chmod +x /var/www/project/sync_data.php)、日志目录没创建(手动创建:sudo mkdir -p /var/log/php_sync)。
服务器重启后进程没启动 忘记设置Supervisor开机自启了!执行下面这行命令:
sudo systemctl enable supervisord
最后说两句
Supervisor对PHP项目来说,是个小而美的工具。不用写复杂的shell脚本,几行配置就能搞定进程守护,省出的时间能多写几个功能、多测几个bug。刚开始用可能记不住命令,收藏这篇文章,下次需要时直接抄配置、查命令就行~