Heroku部署Django时Celery连接Redis报Connection reset by peer错误
问题排查与解决步骤
该Connection reset by peer报错本质是Celery和Redis服务的连接被对端主动断开,结合Heroku平台特性,按以下顺序排查即可解决:
1. 修正Redis连接协议与地址配置
这是Heroku环境下最常见的触发原因:
- Heroku官方提供的Redis服务默认强制走TLS加密连接,连接前缀为
rediss://,你当前配置的redis://是非加密协议,会直接被服务端拒绝连接 - 不要硬编码Redis连接地址,直接读取Heroku注入的环境变量,避免地址更新后配置失效,修改
settings.py配置:
import os CELERY_BROKER_URL = os.environ.get('REDIS_URL', 'redis://localhost:6379/0') CELERY_RESULT_BACKEND = os.environ.get('REDIS_URL', 'redis://localhost:6379/0')
- 配合TLS连接补充SSL校验配置(Heroku Redis不需要客户端校验证书):
CELERY_BROKER_USE_SSL = {'ssl_cert_reqs': None} CELERY_REDIS_BACKEND_USE_SSL = {'ssl_cert_reqs': None}
2. 修正已知配置笔误
你当前settings.py中的CELERY_TASK_SELERLIZER为拼写错误,正确应为CELERY_TASK_SERIALIZER,虽然该错误不会直接触发连接报错,但会导致后续任务序列化异常,建议提前修正。
3. 适配Heroku环境调整Celery连接参数
Heroku Redis会主动断开空闲过久的连接,且有严格的连接数限制,补充以下配置规避连接被主动回收的问题:
# 关闭broker连接池,适配Heroku短连接场景,避免连接泄漏 BROKER_POOL_LIMIT = 0 # 连接超时设置,避免长时间无响应导致断开 BROKER_CONNECTION_TIMEOUT = 30 # 启动阶段开启连接自动重试 BROKER_CONNECTION_RETRY_ON_STARTUP = True # 配置心跳包,避免服务端判定连接空闲主动断开 CELERY_BROKER_HEARTBEAT = 60
4. 验证基础服务与启动配置
- 登录Heroku控制台查看绑定的Redis插件状态,确认无欠费、资源超限、服务异常的提示
- 可以通过Heroku CLI执行
heroku redis:cli测试Redis连接,若能正常进入交互页则说明Redis服务本身正常,问题出在应用侧配置 - 确认
Procfile中Celery启动命令正确,不要将worker和beat放在同一进程启动,示例配置:
web: gunicorn NewsApi.wsgi --log-file - worker: celery -A NewsApi worker --loglevel=info --concurrency=2 beat: celery -A NewsApi beat --loglevel=info
内容的提问来源于stack exchange,提问作者Rudrakshi
相关产品推荐
相关产品推荐

