You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:39:09