升级后Heroku Redis运行Celery Worker报Connection reset by peer错误
Heroku Redis实例此前运行正常,升级后启动Celery Worker时报错如下:
[2021-07-23 11:06:08,135: ERROR/MainProcess] consumer: Cannot connect to redis://:**@ec2-54-***-***-*.eu-west-1.compute.amazonaws.com:*****//: Error while reading from socket: (104, 'Connection reset by peer'). Trying again in 12.00 seconds... (6/100)
已更新所有相关组件到最新版本,删除原有Redis实例重建后问题仍然存在。
优先检查Heroku Redis TLS强制配置:升级后的Heroku Redis默认开启强制TLS连接,Celery默认使用非TLS方式连接Redis会被服务端主动断开,触发
Connection reset by peer报错。
修正方式有两种:- 修改Redis连接字符串前缀,将
redis://改为rediss://(多一个s代表走TLS通道) - 在Celery配置中新增TLS相关参数,示例如下:
import os # broker配置 BROKER_URL = os.environ.get("REDIS_URL") BROKER_USE_SSL = {"ssl_cert_reqs": None} # 结果后端配置(如果用Redis做结果存储) RESULT_BACKEND = os.environ.get("REDIS_URL") RESULT_BACKEND_TRANSPORT_OPTIONS = {"ssl_cert_reqs": None}命令行临时启动测试可以直接执行:
celery -A 你的项目名 worker --broker=rediss://:**@ec2-54-***-***-*.eu-west-1.compute.amazonaws.com:*****//?ssl_cert_reqs=none- 修改Redis连接字符串前缀,将
检查可信IP白名单配置:如果你使用的是付费版Heroku Redis,默认开启了可信源访问限制,需要将运行Celery的服务IP添加到Heroku Redis的可信IP列表中,本地测试需要添加本地公网IP,Heroku Dyno运行需要添加对应Dyno的出口IP段,也可以临时关闭可信源限制验证是否是该问题导致。
验证连接可用性:本地安装redis-cli后执行以下命令测试Redis服务连通性:
redis-cli -u 你的REDIS_URL --tls ping
正常会返回PONG,如果该命令执行报错则说明是网络或Redis实例本身的问题,反之则确认是Celery配置问题。检查依赖版本兼容性:确认redis-py版本≥3.5.3,Celery版本≥5.0,低版本依赖对新的Heroku Redis TLS协议适配存在缺陷,会引发连接异常。
内容的提问来源于stack exchange,提问作者user13019610

