Python/Django项目对接Heroku Redis出现Celery连接10054报错如何解决?
问题原因
这个10054错误是Redis服务端主动断开了Celery的连接请求,核心触发原因有以下几个:
- Heroku Redis 6及以上版本默认强制要求TLS加密连接,你当前配置的Redis URL未携带SSL相关参数,不符合服务端连接要求,被直接断开
- 你贴出的settings.py配置中,
CELERY_RESULT_BACKEND等配置存在多余前置缩进,会导致Django无法正确读取Celery配置 - 硬编码Redis连接地址,未使用Heroku自动注入的
REDIS_URL环境变量,可能存在地址过期、配置不匹配问题 - 缺少Redis SSL依赖,或Celery、Redis SDK版本不兼容
解决方案
- 修正Celery SSL配置,替换settings.py中原有的Celery相关配置为以下内容:
import os # Celery Broker - Redis CELERY_BROKER_URL = os.getenv('REDIS_URL') CELERY_BROKER_USE_SSL = {'ssl_cert_reqs': None} CELERY_RESULT_BACKEND = os.getenv('REDIS_URL') CELERY_REDIS_BACKEND_USE_SSL = {'ssl_cert_reqs': None} CELERY_ACCEPT_CONTENT = ['json'] CELERY_TASK_SERIALIZER = 'json'
注意所有配置项顶格编写,不要加多余缩进。直接读取Heroku的REDIS_URL环境变量,不要硬编码连接地址。
- 安装匹配的依赖包,执行以下命令更新依赖:
pip install redis>=4.0.0 celery>=5.2.0 django-celery-beat
如果需要生成requirements.txt,记得把以上依赖写入文件同步到Heroku。
- 验证Redis连接可用性,部署到Heroku后执行以下命令测试连通性:
heroku run python -c "import os, redis; r = redis.from_url(os.getenv('REDIS_URL'), ssl_cert_reqs=None); print(r.ping())"
返回True则说明Redis连接正常。
本地测试建议使用本地Redis服务,避免Heroku Redis公网访问限制导致的连接问题。若需要本地连接Heroku Redis,保持上述SSL配置即可。
如果你要实现指定日期触发邮件的定时功能,还需要配置
django-celery-beat启动Beat进程,在Heroku的Procfile中添加对应的进程配置:
web: gunicorn incFleet.wsgi worker: celery -A incFleet worker --loglevel=info beat: celery -A incFleet beat --loglevel=info --scheduler django_celery_beat.schedulers:DatabaseScheduler
然后在Django后台配置对应的定时任务规则即可。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

