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

Docker部署下Django连接RabbitMQ报AMQPConnectionError问题求助

错误原因分析

pika.exceptions.AMQPConnectionError本质是无法建立到RabbitMQ服务器的网络连接,结合你的配置和代码,具体问题出在这几点:

  • 容器网络寻址错误:Django后端运行在独立Docker容器中,代码里硬编码localhost作为RabbitMQ地址,但容器内的localhost指向容器自身,而非RabbitMQ服务容器。Docker Compose中,服务名称(这里是rabbitmq)可作为DNS名称在容器间直接访问。
  • RabbitMQ绑定限制:你给RabbitMQ服务设置了RABBITMQ_DEFAULT_HOST=localhost,这会让RabbitMQ仅监听容器内部的localhost接口,导致其他容器无法连接。
  • 启动时序问题:depends_on仅保证容器启动顺序,不确保RabbitMQ服务完全就绪就启动Django,此时发起连接必然失败。
解决方案

1. 修正RabbitMQ的环境变量配置

修改docker-compose.yml中RabbitMQ服务的环境变量,移除RABBITMQ_DEFAULT_HOST=localhost,让RabbitMQ默认监听所有网络接口:

rabbitmq:
  image: rabbitmq:3.8-management-alpine
  hostname: rabbitmq
  ports:
    - 15673:15672
  environment:
    - RABBITMQ_DEFAULT_USER=guest
    - RABBITMQ_DEFAULT_PASS=guest

2. 修改produce.py的连接逻辑,读取环境变量

不要硬编码RabbitMQ地址,改用你在backend服务中配置的环境变量,同时添加认证逻辑:

import pika, os, django
from .models import Product

# 从环境变量读取RabbitMQ配置
rabbitmq_host = os.environ.get('RABBITMQ_DEFAULT_HOST', 'rabbitmq')
rabbitmq_user = os.environ.get('RABBITMQ_DEFAULT_USER', 'guest')
rabbitmq_pass = os.environ.get('RABBITMQ_DEFAULT_PASS', 'guest')

# 创建带认证的连接参数
credentials = pika.PlainCredentials(rabbitmq_user, rabbitmq_pass)
connection = pika.BlockingConnection(
    pika.ConnectionParameters(host=rabbitmq_host, credentials=credentials)
)

channel = connection.channel()

def callback(ch, method, properties, body):
    import json
    print('Received in admin')
    id = json.loads(body)
    product = Product.objects.get(id=id)
    product.likes = product.likes + 1
    product.save()  # 必须调用save才能将修改写入数据库
    print("Product Liked!!! ")

channel.basic_consume(queue='admin', on_message_callback=callback, auto_ack=True)

print("Started Consuming")
channel.start_consuming()
channel.close()

3. 添加RabbitMQ就绪等待逻辑(推荐)

depends_on不保证服务就绪,你可以在Django启动前添加等待逻辑,确保RabbitMQ完全启动。修改backend服务的command:

backend:
  # 其他配置保持不变
  command: >
    sh -c "until nc -z rabbitmq 5672; do echo Waiting for RabbitMQ; sleep 2; done; python manage.py runserver 0.0.0.0:8000"

注意:需要确保你的Django镜像安装了netcat工具——Alpine镜像可通过apk add nc安装,Debian/Ubuntu镜像用apt-get install netcat。

4. 验证连接

启动服务后,访问RabbitMQ管理界面(http://localhost:15673,用户名/密码均为guest),在「Connections」页面查看是否有来自backend容器的连接。

内容的提问来源于stack exchange,提问作者Usama Hameed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:35:56