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
问题3:Erlang cookie 问题
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" 问题都能解决。最常见的原因是:
-
RabbitMQ 服务没启动
-
防火墙阻止了连接
-
RabbitMQ 配置为只监听本地回环地址