使用Celery Beat+带密码Redis时抛出No Auth异常的技术咨询
解决Celery + Redis(带密码)的No Auth认证异常
老兄,你的问题很典型——你给Redis设置了密码验证,但Celery(包括你用的RedBeat调度器)压根没把密码带上就去连Redis了,自然会被拒绝抛出No Auth错误。下面给你几个靠谱的解决办法:
方法1:在Django配置文件里统一设置Redis认证
找到你的Django项目里的settings.py(或者专门的Celery配置文件),添加以下配置:
# Celery的消息队列和结果存储连接 CELERY_BROKER_URL = 'redis://:PASSWORD@redis:6379/0' CELERY_RESULT_BACKEND = 'redis://:PASSWORD@redis:6379/0' # 别忘了RedBeat调度器的Redis连接配置! RED_BEAT_REDIS_URL = 'redis://:PASSWORD@redis:6379/0'
这里的URL格式是redis://:密码@主机名:端口/数据库编号,冒号紧跟在//后面就是密码部分,Redis默认没有用户名,除非你额外配置了,所以不用填写。
方法2:在Docker Compose命令或环境变量里指定
如果不想修改代码配置,也可以直接在docker-compose.yml里调整celeryworker的配置:
方式A:命令行直接指定broker和backend
celeryworker: <<: *django depends_on: - redis - postgres command: "celery -E -A rhombus.taskapp worker --beat --scheduler redbeat.schedulers:RedBeatScheduler --loglevel INFO --uid taskmaster --concurrency=5 --broker=redis://:PASSWORD@redis:6379/0 --result-backend=redis://:PASSWORD@redis:6379/0"
方式B:用环境变量传递所有配置
因为RedBeat不会自动读取Celery的broker配置,所以单独给它设环境变量更稳妥:
celeryworker: <<: *django depends_on: - redis - postgres environment: - RED_BEAT_REDIS_URL=redis://:PASSWORD@redis:6379/0 - CELERY_BROKER_URL=redis://:PASSWORD@redis:6379/0 - CELERY_RESULT_BACKEND=redis://:PASSWORD@redis:6379/0 command: "celery -E -A rhombus.taskapp worker --beat --scheduler redbeat.schedulers:RedBeatScheduler --loglevel INFO --uid taskmaster --concurrency=5"
几个需要注意的检查点
- 确保
PASSWORD和你Redis命令里的--requirepass PASSWORD完全一致,大小写、特殊字符都不能错,如果密码里有@、:这类URL特殊字符,记得要URL编码(比如@编码成%40) - 可以先手动测试Redis连接:进入Redis容器执行
redis-cli,然后输入AUTH PASSWORD,如果返回OK说明密码没问题 - RedBeat的配置很容易被忽略!因为它是独立的调度器,会自己连接Redis存储任务调度信息,所以必须单独给它配置带密码的Redis URL,这是很多人踩坑的地方
内容的提问来源于stack exchange,提问作者Rajesh Yogeshwar
相关产品推荐
相关产品推荐

