Laravel生产环境队列需同时配置Horizon与Supervisor:Horizon提供监控、伸缩、重试,Supervisor保障进程常驻;二者配合并确保Redis连通、正确配置环境与权限,才能实现稳定可观测可伸缩。

要让 Laravel 队列在生产环境真正稳定、可观测、可伸缩,必须同时配好 Horizon 和 Supervisor —— 前者管“看”和“调”,后者管“活”和“稳”。只装 Horizon 不用 Supervisor,服务一断就停;只用 Supervisor 跑 queue:work,又缺监控、难扩容、无重试策略。两者配合才是完整方案。
确保 Redis 驱动已就位
Horizon 仅支持 Redis,Supervisor 守护的也是 Redis 队列进程,所以第一步不是装包,而是确认底层通畅:
- .env 中设置 QUEUE_CONNECTION=redis,且 REDIS_HOST、REDIS_PORT、REDIS_PASSWORD(如有)全部正确
- config/queue.php 中 redis 连接配置需能连通,建议用
php artisan tinker手动测试:Redis::ping() - Horizon 内部会额外使用一个名为 horizon 的 Redis 连接(保留名),不要在 config/database.php 中复用该名称
安装并配置 Horizon
Horizon 不只是个面板,它是一套带自动伸缩、失败策略和代码化配置的队列运行时:
- 执行
composer require laravel/horizon安装扩展 - 运行
php artisan horizon:install:生成 config/horizon.php 并发布迁移文件 - 执行
php artisan migrate创建 horizon_jobs、failed_jobs 等表 - 编辑 config/horizon.php,重点配置 environments 段:
– 生产环境示例:'production' => ['supervisor-1' => ['connection' => 'redis', 'queue' => ['default', 'emails'], 'processes' => 8, 'timeout' => 90]]
– 开启fast_termination => true,避免部署时任务被强制中断
– 设置trim' => ['failed' => 7, 'recent' => 24]控制日志保留天数,防止磁盘撑满 - 别忘了
php artisan config:clear让新配置生效
用 Supervisor 守护 Horizon 主进程
Horizon 启动后是常驻 PHP 进程(php artisan horizon),终端关闭或服务器重启就会退出。Supervisor 就是来解决这个问题的:
- 在
/etc/supervisor/conf.d/laravel-horizon.conf创建配置文件 - 内容示例(路径按实际项目调整):
[program:laravel-horizon]<br> command=php /var/www/your-app/artisan horizon<br> autostart=true<br> autorestart=true<br> user=www-data<br> redirect_stderr=true<br> stdout_logfile=/var/log/laravel-horizon.log - 重载 Supervisor:
supervisorctl reread && supervisorctl update && supervisorctl start laravel-horizon - 验证是否运行:
supervisorctl status应显示 RUNNING,且ps aux | grep horizon能看到多个 worker 进程
启用 Web 监控面板与权限控制
Horizon 面板默认路由为 /horizon,但需显式开放访问权限:
- 检查
app/Providers/HorizonServiceProvider.php是否已注册(horizon:install 通常自动完成) - 在
app/Providers/HorizonServiceProvider.php的 boot() 方法中配置鉴权逻辑:
Horizon::auth(function ($request) {<br> return $request->user() && $request->user()->is_admin;<br> }); - 确保 Nginx/Apache 已允许 public 目录下静态资源访问(如 horizon.js、horizon.css)
- 访问
https://yoursite.com/horizon,应能看到实时 Metrics、Jobs、Failures、Supervisors 等标签页
配完这四步,你的队列就有了自动扩缩的 worker、失败任务一键重试、积压预警、处理耗时分析和崩溃自愈能力。不复杂,但每一步漏掉都可能让高并发场景下的任务悄无声息地卡住或丢失。


















