You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel跨服务器Redis队列调度视频转码任务无响应排查

跨服务器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:38:19