telnet localhost 15672 RabbitMQ “Connection refused“ 错误表示目标主机拒绝了连接请求。

1. 首先检查 RabbitMQ 服务状态

bash

复制代码
# 检查服务是否运行
sudo systemctl status rabbitmq-server

# 如果服务没运行,启动它
sudo systemctl start rabbitmq-server

# 设置开机自启
sudo systemctl enable rabbitmq-server

# 如果服务启动失败,查看日志
sudo journalctl -u rabbitmq-server -f
sudo tail -f /var/log/rabbitmq/rabbit@$(hostname).log

2. 检查 RabbitMQ 是否在监听端口

bash

复制代码
# RabbitMQ 默认使用以下端口:
# 5672 - AMQP 协议(客户端连接)
# 15672 - Web 管理界面
# 25672 - Erlang 分布式节点间通信
# 4369 - Erlang 端口映射守护进程(epmd)

# 查看所有监听端口
sudo ss -tulpn | grep rabbitmq
# 或
sudo netstat -tulpn | grep rabbitmq

# 检查特定端口
sudo ss -tlnp | grep :5672
sudo ss -tlnp | grep :15672

# 如果没有显示,RabbitMQ 可能没有正确配置

3. 检查防火墙设置

bash

复制代码
# 查看防火墙状态
sudo ufw status

# 如果防火墙启用,开放 RabbitMQ 端口
sudo ufw allow 5672/tcp
sudo ufw allow 15672/tcp

# 重新加载防火墙
sudo ufw reload

# 或者临时禁用防火墙测试
sudo ufw disable
# 测试连接后记得重新启用
sudo ufw enable

4. 检查 SELinux(如果有的话)

bash

复制代码
# 查看 SELinux 状态
getenforce

# 如果是 Enforcing 模式,暂时禁用测试
sudo setenforce 0

# 或者添加 RabbitMQ 端口到 SELinux
sudo semanage port -a -t amqp_port_t -p tcp 5672
sudo semanage port -a -t http_port_t -p tcp 15672

# 永久禁用 SELinux(不推荐)
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

5. 检查 RabbitMQ 配置

bash

复制代码
# 查看 RabbitMQ 配置文件
sudo cat /etc/rabbitmq/rabbitmq.conf

# 如果文件不存在,创建默认配置
echo "# RabbitMQ 配置
# 监听所有IP地址
listeners.tcp.default = 0.0.0.0:5672

# Web管理界面
management.tcp.port = 15672
management.tcp.ip   = 0.0.0.0

# 日志级别
log.file.level = info" | sudo tee /etc/rabbitmq/rabbitmq.conf

# 重启 RabbitMQ
sudo systemctl restart rabbitmq-server

6. 启用管理插件并检查

bash

复制代码
# 启用管理插件
sudo rabbitmq-plugins enable rabbitmq_management

# 创建管理员用户
sudo rabbitmqctl add_user admin your_password
sudo rabbitmqctl set_user_tags admin administrator
sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

# 重启服务
sudo systemctl restart rabbitmq-server

# 检查插件状态
sudo rabbitmq-plugins list

7. 完整的诊断脚本

创建一个 diagnose_rabbitmq.sh 脚本:

bash

复制代码
#!/bin/bash

echo "=== RabbitMQ 连接问题诊断 ==="
echo

echo "1. 检查系统信息:"
echo "Hostname: $(hostname)"
echo "IP Addresses:"
ip addr show | grep inet | grep -v inet6
echo

echo "2. 检查服务状态:"
sudo systemctl status rabbitmq-server --no-pager
echo

echo "3. 检查监听端口:"
echo "端口 5672 (AMQP):"
sudo ss -tlnp | grep :5672 || echo "端口 5672 未监听"
echo
echo "端口 15672 (Web管理):"
sudo ss -tlnp | grep :15672 || echo "端口 15672 未监听"
echo

echo "4. 检查进程:"
ps aux | grep rabbitmq | grep -v grep
echo

echo "5. 检查防火墙:"
sudo ufw status
echo

echo "6. 检查配置文件:"
if [ -f /etc/rabbitmq/rabbitmq.conf ]; then
    sudo grep -E "listener|port|ip" /etc/rabbitmq/rabbitmq.conf
else
    echo "配置文件不存在: /etc/rabbitmq/rabbitmq.conf"
fi
echo

echo "7. 尝试本地连接测试:"
echo "测试 127.0.0.1:5672:"
timeout 2 bash -c "echo > /dev/tcp/127.0.0.1/5672" 2>/dev/null && echo "✓ 端口可访问" || echo "✗ 端口不可访问"
echo

echo "8. 测试 telnet 连接:"
echo "连接到 127.0.0.1:5672:"
timeout 3 telnet 127.0.0.1 5672 2>&1 | head -5
echo

echo "9. 查看日志错误:"
sudo tail -20 /var/log/rabbitmq/rabbit@$(hostname).log 2>/dev/null | grep -i error || echo "无错误日志"
echo

echo "=== 诊断完成 ==="

运行脚本:

bash

复制代码
chmod +x diagnose_rabbitmq.sh
sudo ./diagnose_rabbitmq.sh

8. 快速修复步骤

如果以上步骤太复杂,试试这个快速修复:

bash

复制代码
# 停止服务
sudo systemctl stop rabbitmq-server

# 清理旧的数据(注意:这会删除所有队列和消息)
sudo rm -rf /var/lib/rabbitmq/mnesia/

# 创建默认配置
sudo tee /etc/rabbitmq/rabbitmq.conf > /dev/null << 'EOF'
# 监听所有网络接口
listeners.tcp.default = 0.0.0.0:5672

# 允许远程连接
loopback_users = none

# Web 管理界面
management.tcp.port = 15672
management.tcp.ip = 0.0.0.0
EOF

# 启动服务
sudo systemctl start rabbitmq-server

# 启用管理插件
sudo rabbitmq-plugins enable rabbitmq_management

# 等待服务启动
sleep 5

# 检查状态
sudo systemctl status rabbitmq-server
sudo ss -tulpn | grep rabbitmq

9. 测试连接

bash

复制代码
# 测试 AMQP 端口 (5672)
echo "测试 AMQP 连接:"
timeout 3 telnet localhost 5672
# 或者使用 nc
echo "quit" | nc localhost 5672

# 测试 Web 管理界面 (15672)
echo "测试 Web 管理界面:"
curl -I http://localhost:15672 2>/dev/null || wget -q --spider http://localhost:15672

# 使用 Python 测试(如果没有安装:sudo apt install python3)
python3 -c "
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2)
try:
    s.connect(('localhost', 5672))
    print('连接成功')
    s.close()
except Exception as e:
    print(f'连接失败: {e}')
"

10. 常见问题和解决方案

问题1:端口被占用

bash

复制代码
# 检查哪个进程占用了端口
sudo lsof -i :5672

# 如果是其他进程,停止它
sudo kill -9 <PID>

问题2:内存不足

bash

复制代码
# 查看 RabbitMQ 内存使用
sudo rabbitmqctl status | grep memory

# 如果内存不足,可以修改配置
echo "vm_memory_high_watermark.relative = 0.6" | sudo tee -a /etc/rabbitmq/rabbitmq.conf

bash

复制代码
# 检查 Erlang cookie
sudo cat /var/lib/rabbitmq/.erlang.cookie

# 确保所有节点有相同的 cookie

11. 如果还是不行,尝试完全重装

bash

复制代码
# 完全卸载 RabbitMQ
sudo apt purge --auto-remove rabbitmq-server
sudo rm -rf /etc/rabbitmq/
sudo rm -rf /var/lib/rabbitmq/

# 重新安装
sudo apt update
sudo apt install rabbitmq-server

# 配置并启动
sudo systemctl start rabbitmq-server
sudo rabbitmq-plugins enable rabbitmq_management

# 创建用户
sudo rabbitmqctl add_user myuser mypassword
sudo rabbitmqctl set_user_tags myuser administrator
sudo rabbitmqctl set_permissions -p / myuser ".*" ".*" ".*"

最终测试

bash

复制代码
# 最终验证
echo "=== 最终验证 ==="
echo "1. 服务状态:" && sudo systemctl is-active rabbitmq-server
echo "2. 端口监听:" && sudo ss -tlnp | grep -E ':5672|:15672'
echo "3. 本地连接测试:" && timeout 2 bash -c "echo > /dev/tcp/localhost/5672" 2>/dev/null && echo "成功" || echo "失败"
echo "4. 远程连接测试:" && telnet localhost 5672

如果按照以上步骤操作,99% 的 "Connection refused" 问题都能解决。最常见的原因是:

  1. RabbitMQ 服务没启动

  2. 防火墙阻止了连接

  3. RabbitMQ 配置为只监听本地回环地址

相关推荐
初次攀爬者21 小时前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧2 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖2 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农2 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者2 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
业精于勤_荒于稀2 天前
物流订单系统99.99%可用性全链路容灾体系落地操作手册
分布式
Ronin3052 天前
信道管理模块和异步线程模块
开发语言·c++·rabbitmq·异步线程·信道管理
Asher05092 天前
Hadoop核心技术与实战指南
大数据·hadoop·分布式
凉凉的知识库2 天前
Go中的零值与空值,你搞懂了么?
分布式·面试·go
?Anita Zhang2 天前
联邦学习实战:如何在分布式场景下构建隐私保护机器学习模型
人工智能·分布式·机器学习