FastAPI集成Celery与RabbitMQ时提交任务报错kombu.exceptions.OperationalError: [Errno 111] Connection refused求助
解决Celery + FastAPI + RabbitMQ Docker环境下的连接拒绝问题
这个kombu.exceptions.OperationalError: [Errno 111] Connection refused错误的核心原因是FastAPI容器无法正确定位到RabbitMQ服务,而你在宿主机启动Celery Worker时能正常连接(说明Worker的网络路径是通的,但FastAPI的连接配置有误)。下面分步骤帮你解决:
1. 修正Celery的Broker地址
你的celery_config.py里用了localhost作为RabbitMQ的主机名,但FastAPI运行在Docker容器中,容器内的localhost指向容器自身,而非宿主机或RabbitMQ容器。Docker Compose的服务之间可以通过服务名称直接互相访问,所以把Broker地址改成RabbitMQ的服务名rabbitmq:
from celery import Celery app = Celery('celery_tutorial', broker="amqp://guest:guest@rabbitmq:5672//", include=['task'])
2. 选择Worker的运行方式(二选一)
选项A:在宿主机运行Celery Worker
如果习惯在本地启动Worker,需要让宿主机能访问到Docker里的RabbitMQ:
- 修改
docker-compose.yml,给RabbitMQ添加AMQP端口(5672)的映射:rabbitmq: image: rabbitmq:3.8-management-alpine ports: - 15673:15672 - 5672:5672 # 新增宿主机到容器的端口映射 - 重启Docker服务:
docker-compose down && docker-compose up -d - 再在宿主机启动Worker:
celery -A celery_config worker --loglevel=info
选项B:在Docker Compose中运行Worker(推荐)
把Worker也放进Docker容器,这样所有服务处于同一网络,无需端口映射,稳定性更强:
- 取消
docker-compose.yml中celery_worker的注释,同时修正stdin_open: true的缩进(它属于服务配置,不能放在services节点外):version: "3.9" services: main_app: build: context: . dockerfile: fastapi.Dockerfile command: uvicorn main:app --host 0.0.0.0 --reload ports: - "8000:8000" stdin_open: true rabbitmq: image: rabbitmq:3.8-management-alpine ports: - 15673:15672 # 可选:添加健康检查,确保RabbitMQ完全就绪后再启动Worker healthcheck: test: ["CMD", "rabbitmq-diagnostics", "ping"] interval: 30s timeout: 30s retries: 3 celery_worker: build: context: . dockerfile: fastapi.Dockerfile command: celery -A celery_config worker --loglevel=info depends_on: - main_app rabbitmq: condition: service_healthy # 依赖RabbitMQ健康检查通过 stdin_open: true - 构建并启动所有服务:
docker-compose up -d --build - 查看Worker日志,确认是否正常启动:
docker-compose logs celery_worker
3. 验证解决方案
访问FastAPI的/test接口,然后:
- 如果是宿主机Worker,查看终端输出是否有
DONE TASK的打印; - 如果是Docker Worker,用
docker-compose logs celery_worker查看日志; - 也可以登录RabbitMQ管理界面
http://localhost:15673(账号密码均为guest),查看队列是否有任务被正常消费。
额外注意事项
- 确保Docker Compose默认网络正常,所有服务处于同一网络,可通过服务名互相访问;
- 如果遇到RabbitMQ启动慢的问题,健康检查能避免Worker在RabbitMQ未就绪时启动导致的连接失败;
- 不要混淆容器内的
localhost和宿主机的localhost,这是Docker环境下最常见的连接误区之一。
内容的提问来源于stack exchange,提问作者usama97
相关产品推荐
相关产品推荐

