Laravel跨服务器Redis队列调度视频转码任务无响应排查
咱们先抓最明显的配置错误,再一步步验证连接和队列匹配逻辑:
1. 修正Redis连接的Host配置(致命问题)
你在SERVER2的videoRedisQueue连接配置里,host填了https://website.ca/——这完全错误!Redis是基于TCP的协议,不需要HTTP/HTTPS前缀,应该填SERVER2的公网IP地址或者不带协议的域名,比如:
'videoRedisQueue' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', 'xxx.xxx.xxx.xxx'), // 这里填SERVER2的公网IP 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_DB', '0'), ],
注意:SERVER1也需要配置这个videoRedisQueue连接(因为SERVER1要把任务推到SERVER2的Redis),所以SERVER1的config/database.php里也要加上同样的videoRedisQueue配置,并且在SERVER1的.env里设置对应的REDIS_HOST为SERVER2的公网IP。
2. 补全SERVER2的Redis公网访问权限配置
你的思路1方向是对的,但还要补全几个关键步骤:
- 修改
/etc/redis/redis.conf:- 将
bind 127.0.0.1改为bind 0.0.0.0(允许所有网卡接收请求) - 将
protected-mode yes改为protected-mode no(关闭保护模式,否则即使bind 0.0.0.0也会拒绝外部连接) - 设置
requirepass your_strong_password(一定要加密码,避免Redis被恶意访问)
- 将
- 重启Redis服务:
sudo systemctl restart redis-server - 配置防火墙限制仅SERVER1的IP访问6379端口(以ufw为例):
sudo ufw allow from SERVER1_IP to any port 6379 sudo ufw reload
3. 确保队列配置与监听命令完全匹配
任务推送端(SERVER1)
你的ConvertVideoForHLS Job里指定了onConnection('videoProcessingRedis')和onQueue('videoRedisQueue'),要确保SERVER1的config/queue.php里的videoProcessingRedis配置,正确指向SERVER2的Redis连接:
// SERVER1的config/queue.php 'videoProcessingRedis' => [ 'driver' => 'redis', 'connection' => 'videoRedisQueue', // 对应SERVER1里配置的SERVER2 Redis连接 'queue' => env('REDIS_QUEUE_VIDEO', 'videoRedisQueue'), 'retry_after' => 90, 'block_for' => null, ],
同时在SERVER1的.env里设置REDIS_QUEUE_VIDEO=videoRedisQueue,保证队列名称一致。
任务消费端(SERVER2)
SERVER2的队列配置要和SERVER1推送时的配置完全对齐,并且监听命令要明确指定对应的connection和queue:
# 在SERVER2上执行,监听指定的连接和队列 php artisan queue:listen videoProcessingRedis --queue=videoRedisQueue
如果用Supervisor管理队列,要把command字段改成这个命令,避免监听默认队列导致任务被忽略。
4. 验证Redis连接是否正常
- 在SERVER1上用
redis-cli直接测试连接SERVER2的Redis:redis-cli -h SERVER2_IP -p 6379 -a your_strong_password # 连接成功后执行PING,返回PONG就是正常的 PING - 在SERVER1的Laravel项目里,通过Artisan命令测试连接:
php artisan tinker # 测试连接SERVER2的Redis Redis::connection('videoRedisQueue')->ping(); # 返回true说明连接正常;报错的话直接看错误信息定位问题
5. 排查日志定位问题
任务没踪迹的话,优先看这几个日志:
- SERVER1的Laravel日志(
storage/logs/laravel.log):有没有Redis连接失败、任务推送失败的错误 - SERVER2的Redis日志(通常在
/var/log/redis/redis-server.log):有没有拒绝连接的记录 - SERVER2的Supervisor日志:确认监听命令是否正常启动,有没有报错
按照这些步骤排查,大概率能解决问题——核心问题应该是Redis连接配置错误或者权限未开放,导致任务根本没推送到SERVER2的Redis队列里。
内容的提问来源于stack exchange,提问作者kuramura143

