supervisord 是 linux 下轻量级进程管理工具,支持自动拉起崩溃进程、日志记录和热重启。安装推荐 centos 用 yum(需先装 epel-release)、ubuntu/debian 用 pip3;为 hyperf 配置需指定绝对路径、directory、user、autorestart 等关键项;修改配置后须执行 reread 和 update 加载;支持多实例与平滑重启(通过 signal hup 或滚动部署)。

Supervisord 是 Linux 下轻量级、易配置的进程管理工具,特别适合长期运行 PHP 框架(如 Hyperf)的服务。它能自动拉起崩溃进程、记录日志、支持热重启,比手动 nohup 或 systemd 更直观可控。
一、安装 Supervisord 并初始化配置
大多数 CentOS/RHEL 系统可直接用 yum 安装,Ubuntu/Debian 推荐 pip 安装(避免 apt 版本过旧):
-
CentOS:
yum install -y epel-release && yum install -y supervisor -
Ubuntu/Debian:
pip3 install supervisor(确保 pip3 和 Python3 已就绪) - 生成默认配置:
echo_supervisord_conf > /etc/supervisord.conf(若用 pip 安装,路径可能为/usr/local/etc/supervisord.conf) - 启动 supervisord:
supervisord -c /etc/supervisord.conf,首次运行后可通过supervisorctl -c /etc/supervisord.conf进入控制台
二、为 Hyperf 编写专用进程配置
Hyperf 默认使用 php bin/hyperf.php start 启动,需在 supervisord 中定义为独立 program。在 /etc/supervisord.conf 末尾添加:
[program:hyperf-api] command=php /var/www/myapp/bin/hyperf.php start directory=/var/www/myapp user=www-data autostart=true autorestart=true startretries=3 redirect_stderr=true stdout_logfile=/var/log/hyperf-api.log stdout_logfile_maxbytes=20MB stdout_logfile_backups=5 stopasgroup=true killasgroup=true environment=HYPERF_ENV="prod"
关键点说明:
-
directory必须设为项目根目录,否则 composer autoload 或 config 加载会失败 -
user建议用非 root 用户(如 www-data 或 hyperf),避免权限风险 -
stopasgroup和killasgroup确保主进程退出时,子协程/Worker 进程也被一并终止 -
environment可传入环境变量,Hyperf 会自动识别HYPERF_ENV
三、加载配置并日常管理
修改配置后必须重载,不能只 restart supervisord:
- 重载配置:
supervisorctl -c /etc/supervisord.conf reread→supervisorctl -c /etc/supervisord.conf update - 查看状态:
supervisorctl -c /etc/supervisord.conf status(显示 RUNNING / STARTING / FATAL) - 手动启停:
supervisorctl -c /etc/supervisord.conf start hyperf-api/stop hyperf-api - 实时看日志:
supervisorctl -c /etc/supervisord.conf tail -f hyperf-api
建议把常用命令 alias 成短指令,例如:alias supctl='supervisorctl -c /etc/supervisord.conf'
四、进阶:多实例与平滑重启支持
Hyperf 支持多 Worker 进程,但 Supervisord 本身不提供 reload 信号转发。若需类似 nginx 的平滑重启,推荐两种方式:
-
方案 A(推荐):用 Hyperf 内置 reload 命令 + supervisord signal 控制
先在 program 配置中启用stopsignal=TERM,再通过supervisorctl signal HUP hyperf-api触发 Hyperf 的 reload(需 Hyperf ≥ v3.1,并开启enable_reload) -
方案 B(稳定):部署多个 instance,用 Nginx 做负载,滚动更新单个实例
例如配置hyperf-api-1和hyperf-api-2,停一个、启一个,实现零中断升级
注意:Hyperf 的 reload 不等同于「完全重启」,它仅重新加载代码,不重建 EventLoop;真正需要重载扩展或 Swoole 配置时,仍需 stop + start。










