必须为每个队列创建独立Supervisor program段,分别配置专属command、日志路径及资源参数,并通过reread、update、start all完成加载与启动,最后用status和Redis命令验证进程与队列绑定状态。

如果您在 Laravel 应用中需同时运行多个队列工作进程(如 high、default、notifications 等命名队列),但各进程无法稳定驻留或出现启动失败、自动退出、日志混乱等问题,则很可能是 Supervisor 配置未按多队列场景正确分离。以下是解决此问题的步骤:
一、为每个队列创建独立的 Supervisor program 段
Supervisor 必须为每个队列名称分配专属 program 定义,避免共用同一配置段导致参数冲突、日志混杂或进程复用。每个 program 段需绑定唯一标识、专用命令与隔离日志路径。
1、编辑 Supervisor 配置文件:sudo vim /etc/supervisord.d/laravel-queues.ini
2、为 high 优先级队列添加 program 段:[program:laravel-worker-high]
3、设置其 command 为仅监听 high 队列的 artisan 命令:command=php /var/www/myapp/artisan queue:work --queue=high --sleep=1 --max-jobs=1000 --timeout=60
4、为 notifications 业务队列添加另一段:[program:laravel-worker-notifications]
5、指定其 command 为:command=php /var/www/myapp/artisan queue:work --queue=notifications --sleep=3 --max-jobs=500 --timeout=120
6、为 default 队列添加第三段:[program:laravel-worker-default],command 设置为:command=php /var/www/myapp/artisan queue:work --queue=default --sleep=5 --max-jobs=300 --timeout=90
二、为每个 program 段配置独立运行参数
各队列进程需差异化资源策略:高优队列要求低延迟响应,低频队列应降低 CPU 占用;统一参数将引发资源争抢或空转浪费。参数必须逐段显式声明,不可依赖全局继承。
1、为 laravel-worker-high 设置:autostart=true、autorestart=true、user=www、numprocs=1、redirect_stderr=true
2、为其指定独立日志路径:stdout_logfile=/var/www/myapp/storage/logs/worker-high.log
3、为 laravel-worker-notifications 设置相同基础参数,但日志路径改为:stdout_logfile=/var/www/myapp/storage/logs/worker-notifications.log
4、为 laravel-worker-default 设置:numprocs=2以提升默认队列吞吐能力,并使用日志路径:stdout_logfile=/var/www/myapp/storage/logs/worker-default.log
5、所有 program 段均需启用进程组管理:stopasgroup=true、killasgroup=true,防止子进程残留
三、重载 Supervisor 并验证多进程状态
配置更新后必须触发 Supervisor 重新加载并激活全部 program,否则新增段不会生效;状态验证可确认各进程是否真实运行且绑定正确队列名。
1、强制读取新配置文件:sudo supervisorctl reread
2、将新 program 注册进 Supervisor 内部管理列表:sudo supervisorctl update
3、一次性启动全部队列进程:sudo supervisorctl start all
4、检查各进程当前状态与运行时长:sudo supervisorctl status,输出中应可见 laravel-worker-high RUNNING pid 1234, uptime 00:02:15 等三行独立条目
5、进入 Redis CLI 执行 LRANGE queues:high 0 0 与 LRANGE queues:notifications 0 0,分别确认对应队列存在待处理任务











