Docker部署RabbitMQ出现5672端口AMQP连接关闭、Spring集成连接超时问题
问题根因定位
所有故障本质来自两个低级配置错误,加上错误的测试方法放大了排障难度:
- 完全混淆了RabbitMQ两个端口的用途:15672是Web管理后台专属的HTTP端口,仅用于浏览器登录可视化管理界面;5672是AMQP协议业务端口,所有应用客户端(包括Spring、消息生产/消费组件)必须连接这个端口才能和RabbitMQ正常通信。
- 对5672端口的日志存在误判:日志里的
bad_header,<<"GET / HT">>、handshake_timeout报错,根本不是RabbitMQ服务故障——这些都是你用浏览器直接访问5672端口触发的。5672端口仅识别AMQP二进制协议,浏览器发送的HTTP GET请求和协议要求完全不匹配,服务自然会主动断开连接,这恰恰证明5672端口已经正常对外监听了。注意:不要用浏览器访问5672端口做连通性测试,这种测试方法从根上就是错的,只会产生无意义的报错日志。
分步解决操作
1. 修正Spring项目的连接配置
把原来错误指向15672的端口配置改掉,替换为5672的AMQP端口:
spring.rabbitmq.host = 部署RabbitMQ的服务器实际可连通IP spring.rabbitmq.port = 5672 spring.rabbitmq.username = rabbitmquser spring.rabbitmq.password = rabbitmquser
核对日志里出现的192.168.1.212、192.168.100.12两个IP,不要填错服务器地址,更不要尝试用业务客户端连接15672端口——15672端口跑的是管理界面的HTTP服务,根本不响应AMQP协议请求。
2. 清理docker-compose中的冗余风险配置
你当前的compose配置里,有两个从集群部署方案里抄来、单节点部署完全没必要、甚至会引发隐性故障的配置项,直接删除即可:
RABBITMQ_NODE_TYPE=stats:这是RabbitMQ集群中专职统计收集节点的配置,单节点部署开启后会限制AMQP核心业务功能RABBITMQ_NODE_NAME=rabbit@stats:自定义节点名如果没有提前在容器内部做主机名映射,会导致RabbitMQ启动时自识别异常,出现持久化、权限相关的偶发故障
调整后的compose核心配置参考:
rabbitmq: image: 'rabbitmq:3-management-alpine' container_name: rabbitmq ports: - '5672:5672' - '15672:15672' environment: - RABBITMQ_ERL_COOKIE=s3cr3tc00ki3 - RABBITMQ_DEFAULT_USER=rabbitmquser - RABBITMQ_DEFAULT_PASS=rabbitmquser volumes: - '/rabbitmq/data:/var/lib/rabbitmq/' - '/rabbitmq/log:/var/log/rabbitmq'
3. 排查网络与权限类隐性问题
调整配置后如果仍出现连接超时、握手失败,按以下顺序逐一排查:
- 检查服务器防火墙、安全组的入方向规则,确保5672端口是放通的,不要只开放15672端口
- 在Spring应用运行的机器上,用
telnet 部署RabbitMQ的IP 5672做连通性测试,能正常建立TCP连接再启动应用 - 检查持久化目录的权限:alpine版本的RabbitMQ容器内运行用户UID为999,给宿主机的挂载目录分配对应读写权限,避免RabbitMQ进程因为无权限读写持久化文件导致服务异常:
chown -R 999:999 /rabbitmq/data /rabbitmq/log - 重启RabbitMQ容器时,确保旧容器完全停止、删除后再启动新容器,避免残留的节点状态和新配置冲突
内容的提问来源于stack exchange,提问作者Theara
相关产品推荐
相关产品推荐

