使用 Supervisor 管理 RabbitMQ Worker:完整指南
在 Laravel 应用中使用 RabbitMQ 作为队列驱动后,使用 Supervisor 守护进程管理 Worker 是确保队列服务稳定运行的关键。以下是详细配置指南:
1. 安装 Supervisor
# Ubuntu/Debian
sudo apt update
sudo apt install supervisor
# CentOS/RHEL
sudo yum install supervisor
sudo systemctl enable supervisor
sudo systemctl start supervisor
2. 创建 Supervisor 配置文件
在 /etc/supervisor/conf.d/
目录下创建配置文件(例如 laravel-rabbitmq-worker.conf
):
sudo nano /etc/supervisor/conf.d/laravel-rabbitmq-worker.conf
基础配置模板
[program:laravel-rabbitmq-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/your/project/artisan queue:work rabbitmq --sleep=3 --tries=3 --max-jobs=1000
autostart=true
autorestart=true
user=www-data
numprocs=8
redirect_stderr=true
stdout_logfile=/path/to/your/project/storage/logs/worker.log
stopwaitsecs=60
stopasgroup=true
killasgroup=true
3. 高级配置选项
多队列优先级配置
[program:laravel-rabbitmq-high]
command=php /path/to/artisan queue:work rabbitmq --queue=high_priority --sleep=0 --tries=3 --max-jobs=500
numprocs=4
priority=900
...
[program:laravel-rabbitmq-default]
command=php /path/to/artisan queue:work rabbitmq --queue=default --sleep=1 --tries=5 --max-jobs=1000
numprocs=6
priority=800
...
[program:laravel-rabbitmq-low]
command=php /path/to/artisan queue:work rabbitmq --queue=low_priority --sleep=5 --tries=3 --max-jobs=2000
numprocs=2
priority=700
...
吞吐量优化配置
[program:laravel-rabbitmq-optimized]
command=php /path/to/artisan queue:work rabbitmq \
--prefetch=50 \ # 每次预取消息数
--timeout=120 \ # 任务超时时间
--backoff=300 \ # 失败重试间隔
--max-time=3600 \ # 最大运行时间(秒)
--memory=256 \ # 内存限制(MB)
--sleep-when-empty=0.1 \ # 空队列等待时间
--batch=100 \ # 批量处理消息数
--max-jobs=500 # 处理任务数后重启
numprocs=16
...
4. 环境变量配置
在 Laravel 项目根目录创建 .env.supervisor
文件:
QUEUE_CONNECTION=rabbitmq
RABBITMQ_HOST=rabbitmq-cluster.example.com
RABBITMQ_PORT=5671
RABBITMQ_USER=worker
RABBITMQ_PASSWORD=secure_password
RABBITMQ_VHOST=/production
在 Supervisor 配置中加载环境变量:
environment=HOME="/home/www-data",USER="www-data",PATH="/usr/bin:/usr/local/bin",LARAVEL_ENV="production"
envfile=/path/to/your/project/.env.supervisor
5. 配置日志轮转
创建日志轮转配置 /etc/logrotate.d/laravel-worker
:
/path/to/your/project/storage/logs/worker.log {
rotate 15
daily
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/bin/supervisorctl signal SIGHUP laravel-rabbitmq-worker >/dev/null 2>&1
endscript
}
6. 应用并管理配置
# 重新加载配置
sudo supervisorctl reread
sudo supervisorctl update
# 启动所有 Worker
sudo supervisorctl start laravel-rabbitmq-worker:*
# 查看状态
sudo supervisorctl status
# 重启特定 Worker
sudo supervisorctl restart laravel-rabbitmq-worker:laravel-rabbitmq-worker_00
# 停止所有 Worker
sudo supervisorctl stop all
7. 生产环境优化建议
进程数量计算
numprocs = (CPU核心数 × 2) + (I/O密集型任务 ? 4 : 0)
例如:
- 4核CPU:
numprocs = (4×2) = 8
- 4核CPU + I/O密集型:
numprocs = (4×2)+4 = 12
资源限制规则
; 内存限制(防止内存泄漏)
memory = 256 ; MB
; CPU分配(基于cgroups)
; cpu_affinity=0,1 ; 绑定到特定CPU核心
优雅重启策略
# 平滑重启 Worker(完成当前任务后重启)
php artisan queue:restart
# 配置自动滚动重启
[program:...]
startsecs=10
stopwaitsecs=3600
8. 监控与告警
集成 Prometheus 监控
安装监控插件:
composer require spatie/laravel-server-monitor
配置监控指标:
// config/server-monitor.php
'checks' => [
\Spatie\ServerMonitor\CheckDefinitions\SupervisorProcessCount::class => [
'process_name' => 'laravel-rabbitmq-worker',
'warning_if_more_than' => 8,
'warning_if_less_than' => 4,
],
\Spatie\ServerMonitor\CheckDefinitions\RabbitMQQueueSize::class => [
'warning_threshold' => 1000,
'fail_threshold' => 5000,
],
],
告警规则示例
# prometheus/rules.yml
- name: rabbitmq_worker_alerts
rules:
- alert: WorkerDown
expr: up{job="supervisor"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: "RabbitMQ worker down ({{ $labels.instance }})"
- alert: HighQueueBacklog
expr: rabbitmq_queue_messages_ready > 5000
for: 15m
labels:
severity: warning
annotations:
summary: "High queue backlog ({{ $value }} messages)"
9. 常见问题解决
Worker 不启动
# 检查日志
sudo tail -f /var/log/supervisor/supervisord.log
# 测试命令
sudo -u www-data php /path/to/artisan queue:work rabbitmq --once
消息积压处理
# 临时增加 Worker 进程
sudo supervisorctl add laravel-rabbitmq-temp
sudo supervisorctl start laravel-rabbitmq-temp
# 配置文件 /etc/supervisor/conf.d/laravel-rabbitmq-temp.conf
[program:laravel-rabbitmq-temp]
command=php /path/to/artisan queue:work rabbitmq --sleep=0 --tries=1
numprocs=20
autostart=false
...
内存泄漏处理
; 添加内存监控和自动重启
[program:...]
autorestart=unexpected
startretries=3
max_restarts=10
memory=512 ; MB
10. 最佳实践总结
- 分层配置:为不同优先级队列创建独立的 Supervisor 配置
- 资源隔离:为 CPU/内存密集型任务分配专用 Worker
- 滚动部署:
# 部署脚本示例 php artisan queue:restart sleep 30 # 等待当前任务完成 sudo supervisorctl reload
- 监控三要素:
- 进程状态:
sudo supervisorctl status
- 队列深度:
rabbitmqadmin list queues
- 资源使用:
htop -u www-data
- 进程状态:
- 灾难恢复:
# 备份配置 sudo cp -R /etc/supervisor/ /backup/supervisor-config-$(date +%F) # 快速恢复 sudo supervisorctl stop all sudo cp -R /backup/latest/supervisor /etc/ sudo supervisorctl reload
通过以上配置,您的 Laravel RabbitMQ 队列将在 Supervisor 的监控下稳定运行,实现:
- 自动故障恢复
- 资源使用优化
- 灵活的水平扩展
- 全面的监控告警
生产环境建议定期进行压力测试,使用工具如:
# 使用 rabbitmq-perf-test
docker run -it --rm pivotalrabbitmq/perf-test:latest \
--uri amqp://user:pass@rabbitmq-host \
--queue "perf-test-%d" \
--producers 10 \
--consumers 20 \
--rate 5000 \
--time 300