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

Docker环境下Django无法连接RabbitMQ:socket.gaierror错误求助

Docker部署Django与RabbitMQ连接失败问题

错误现象

运行docker-compose up时触发错误:socket.gaierror: [Errno -2] Name or service not known,即使连接字符串使用了RabbitMQ容器名称,Django容器仍无法与RabbitMQ容器建立连接。

问题根源

  • pika连接参数格式错误:pika.ConnectionParameters的host参数仅接收主机地址,不能直接传入完整AMQP URL,需改用pika.URLParameters解析完整连接字符串。
  • 连接初始化时机过早:producer.py在模块加载阶段就尝试创建RabbitMQ连接,此时RabbitMQ可能健康检查通过但内部服务(如指定vhost)尚未完全就绪,导致连接失败。
  • 通道提前关闭:模块级别代码创建通道后立刻关闭,调用publish函数时通道已不可用,无法发送消息。

修复方案

1. 修正连接参数格式

使用pika.URLParameters解析完整AMQP连接字符串,替代错误的host参数传值方式。

2. 延迟连接初始化

将连接和通道的创建逻辑移至publish函数内部,确保仅在需要发送消息时才尝试建立连接,避免模块加载阶段的无效连接尝试。

3. 避免提前关闭通道

移除模块级别的通道关闭代码,每次调用publish时创建新的连接和通道(开发阶段足够,生产环境可考虑连接池优化)。

修改后的代码

producer.py

import pika
import json

def publish(method, body):
    # 解析AMQP连接字符串
    parameters = pika.URLParameters('amqp://guest:guest@rabbitmq:5672/vhost')
    # 建立连接和通道
    connection = pika.BlockingConnection(parameters)
    channel = connection.channel()
    
    # 确保队列存在(幂等操作,重复执行无影响)
    channel.queue_declare(queue='main')
    
    # 设置消息属性并发送
    properties = pika.BasicProperties(method)
    # 将Python对象转为JSON字符串字节流
    channel.basic_publish(
        exchange='',
        routing_key='main',
        body=json.dumps(body),
        properties=properties
    )
    
    # 发送完成后关闭连接
    connection.close()

额外优化建议

  • 确保Django项目的requirements.txt中包含pika依赖,Docker构建时会自动安装。
  • 增强RabbitMQ的健康检查,确保vhost创建完成后才标记服务健康:
    # docker-compose.yml中rabbitmq服务的healthcheck修改为
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "check_vhost", "vhost"]
      interval: 30s
      timeout: 30s
      retries: 10
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:07:44