Django+Celery配置RabbitMQ却连接Redis的问题求助
解决思路
1. 排查环境变量覆盖问题
你的docker-compose.yml中web和celery服务都加载了./env.dev文件,环境变量优先级高于settings.py中的配置。打开env.dev文件,检查是否存在如下变量:
CELERY_BROKER_URLBROKER_URLCELERY_RESULT_BACKEND
如果这些变量被设置为Redis地址(比如redis://localhost:6380//),直接删除或修改为RabbitMQ的配置:
CELERY_BROKER_URL=amqp://rabbitmq CELERY_RESULT_BACKEND=amqp://rabbitmq
2. 统一Celery配置前缀
你的celery.py使用了namespace='CELERY'加载配置,这意味着只有以CELERY_开头的变量会被Celery识别。建议在settings.py中统一使用带前缀的配置,删除冗余的无前缀变量:
# 保留带CELERY_前缀的配置 CELERY_BROKER_URL = 'amqp://rabbitmq' CELERY_BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600} CELERY_RESULT_BACKEND = 'amqp://rabbitmq' # 删除不带前缀的BROKER_URL,避免混淆
3. 验证容器网络连通性
Docker Compose会自动为所有服务创建默认网络,rabbitmq服务名可直接作为主机名访问:
- 执行
docker-compose ps查看rabbitmq容器状态,确保处于Up状态 - 进入web容器后执行
ping rabbitmq,确认能正常解析和连通RabbitMQ服务
4. 确认依赖完整性
确保项目的requirements.txt中包含Celery连接RabbitMQ所需的py-amqp库,若缺失则添加后重新构建镜像:
py-amqp>=5.0.0 celery>=5.2.6
执行docker-compose build重新构建web和celery镜像,确保依赖生效。
5. 规范Celery启动方式
建议直接通过Docker Compose启动Celery服务,避免进入web容器启动导致的配置不一致:
docker-compose up celery
若需进入容器调试,使用exec而非run --rm(后者会重新创建容器,可能加载错误配置):
docker-compose exec celery bash
再执行celery -A wine_shop worker --loglevel=info启动worker。
内容的提问来源于stack exchange,提问作者Victor Torres
相关产品推荐
相关产品推荐

