Django+Celery+RabbitMQ Docker环境下celery status连接拒绝问题
问题解决:Docker容器内执行
celery status连接RabbitMQ失败 问题描述
Docker部署的Django项目使用RabbitMQ作为Celery Broker,执行docker compose up后所有服务启动正常,但在django容器内运行celery status时出现以下错误:
kombu.exceptions.OperationalError: [Errno 111] Connection refused
而在本地机器运行相同命令却能正常获取worker信息。
相关配置
docker-compose.yml
version: "3" services: db: image: postgres networks: - django volumes: - postgres_db:/var/lib/postgresql/data ports: - 5432:5432 environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres rabbitmq: image: rabbitmq:3-management-alpine networks: - django volumes: - rabbitmq_data:/var/lib/rabbitmq/ - rabbitmq_log:/var/log/rabbitmq ports: - 5672:5672 - 15672:15672 celery_worker: build: . command: celery -A loan_manager worker --loglevel=info networks: - django environment: - CELERY_BROKER_TRANSPORT_URL=amqp://guest:guest@rabbitmq:5672// - DATABASE_NAME=postgres - DATABASE_USER=postgres - DATABASE_PASSWORD=postgres - DATABASE_HOST=db depends_on: - rabbitmq django_app: build: . command: > sh -c "python3 manage.py makemigrations --noinput && python3 manage.py migrate --noinput && python3 manage.py shell < ./utils/create_superuser.py && python3 manage.py runserver 0.0.0.0:8000" networks: - django ports: - "8000:8000" environment: - CELERY_BROKER_TRANSPORT_URL=amqp://guest:guest@rabbitmq:5672// - DATABASE_NAME=postgres - DATABASE_USER=postgres - DATABASE_PASSWORD=postgres - DATABASE_HOST=db depends_on: - db - rabbitmq volumes: postgres_db: rabbitmq_data: rabbitmq_log: networks: django:
celery.py
from __future__ import absolute_import import os from celery import Celery os.environ.setdefault("DJANGO_SETTINGS_MODULE", "loan_manager.settings") app = Celery( "loan_manager", broker=os.environ.get("CELERY_BROKER_TRANSPORT_URL"), backend="rpc://", broker_connection_retry_on_startup=True, ) app.conf.update( CELERY_ACCEPT_CONTENT=["application/json"], CELERY_TASK_SERIALIZER="json", CELERY_RESULT_SERIALIZER="json", ) app.autodiscover_tasks(["apps"])
Celery Worker日志
2023-06-16 16:09:25 [2023-06-16 19:09:25,296: INFO/MainProcess] Connected to amqp://guest:**@rabbitmq:5672// 2023-06-16 16:09:25 [2023-06-16 19:09:25,303: INFO/MainProcess] mingle: searching for neighbors 2023-06-16 16:09:26 [2023-06-16 19:09:26,318: INFO/MainProcess] mingle: all alone 2023-06-16 16:09:26 [2023-06-16 19:09:26,334: INFO/MainProcess] celery@c9c1728a9b1b ready. 2023-06-16 16:09:18 2023-06-16 16:09:18 -------------- celery@c9c1728a9b1b v5.3.0 (emerald-rush) 2023-06-16 16:09:18 --- ***** ----- 2023-06-16 16:09:18 -- ******* ---- Linux-5.10.16.3-microsoft-standard-WSL2-x86_64-with-glibc2.28 2023-06-16 19:09:18 2023-06-16 16:09:18 - *** --- * --- 2023-06-16 16:09:18 - ** ---------- [config] 2023-06-16 16:09:18 - ** ---------- .> app: loan_manager:0x7ff2da1b5d10 2023-06-16 16:09:18 - ** ---------- .> transport: amqp://guest:**@rabbitmq:5672// 2023-06-16 16:09:18 - ** ---------- .> results: rpc:// 2023-06-16 16:09:18 - *** --- * --- .> concurrency: 12 (prefork) 2023-06-16 16:09:18 -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) 2023-06-16 16:09:18 --- ***** ----- 2023-06-16 16:09:18 -------------- [queues] 2023-06-16 16:09:18 .> celery exchange=celery(direct) key=celery 2023-06-16 16:09:18 2023-06-16 16:09:18 2023-06-16 16:09:18 [tasks] 2023-06-16 16:09:18 . apps.loan_proposal.tasks.process_loan_proposals
排查与解决方案
1. 验证容器内环境变量是否正确加载
进入django容器后,先执行以下命令确认Broker地址变量:
echo $CELERY_BROKER_TRANSPORT_URL
如果输出不是amqp://guest:guest@rabbitmq:5672//,说明环境变量未正确传递,检查docker-compose.yml中django_app的environment配置,确保变量拼写无误。
2. 执行celery status时指定完整应用参数
在django容器内执行命令时,必须指定Celery应用名称,否则会使用默认配置导致连接失败:
celery -A loan_manager status
确保命令执行时处于项目根目录(即manage.py所在目录)。
3. 确认RabbitMQ服务完全就绪
depends_on仅保证容器启动顺序,不代表RabbitMQ服务已完全启动。可以在django容器内测试网络连通性:
# 测试ping连通性 ping rabbitmq # 测试端口是否开放 nc -zv rabbitmq 5672
如果端口不通,等待10-20秒后重试,或者在docker-compose中添加健康检查确保RabbitMQ就绪:
rabbitmq: image: rabbitmq:3-management-alpine networks: - django volumes: - rabbitmq_data:/var/lib/rabbitmq/ - rabbitmq_log:/var/log/rabbitmq ports: - 5672:5672 - 15672:15672 healthcheck: test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] interval: 30s timeout: 30s retries: 3
4. 验证Celery配置是否正确读取环境变量
在django容器内运行Python代码验证配置:
import os from celery import Celery os.environ.setdefault("DJANGO_SETTINGS_MODULE", "loan_manager.settings") app = Celery("loan_manager") app.config_from_object('django.conf:settings', namespace='CELERY') print("Broker URL:", app.conf.broker_url)
如果输出为空或错误,检查celery.py中是否正确使用os.environ.get("CELERY_BROKER_TRANSPORT_URL"),或者是否有其他配置覆盖了Broker地址。
内容的提问来源于stack exchange,提问作者Augusto S. de O.
相关产品推荐
相关产品推荐

