测试 amqplib 实例报错 `Error: connect ECONNREFUSED 127.0.0.1:5672` 解决方案

在使用 amqplib 库进行 RabbitMQ 相关开发时,有时会遇到 Error: connect ECONNREFUSED 127.0.0.1:5672 这样的错误。这个错误表示客户端无法连接到指定的 RabbitMQ 服务端地址(这里是本地 127.0.0.15672 端口)。本文将详细分析该错误产生的原因,并提供相应的解决方案。

目录#

错误原因分析#

RabbitMQ 服务未启动#

amqplib 是用于连接 RabbitMQ 的客户端库。如果本地的 RabbitMQ 服务没有启动,那么尝试连接 127.0.0.1:5672(这是 RabbitMQ 默认的端口)就会失败,因为没有服务在监听该端口。

网络连接问题#

虽然是本地连接(127.0.0.1),但也可能存在网络相关的问题。比如网络接口出现故障,或者本地网络配置有误等,导致无法建立有效的连接。

防火墙或安全组设置#

如果服务器(即使是本地开发环境,如果是在虚拟机等环境中)的防火墙阻止了 5672 端口的访问,或者云服务器的安全组没有开放 5672 端口,那么也会出现连接被拒绝的情况。

解决方案#

启动 RabbitMQ 服务#

  • Linux 系统(以 Ubuntu 为例)
    • 首先更新软件包列表:sudo apt update
    • 安装 RabbitMQ:sudo apt install rabbitmq-server
    • 启动服务:sudo systemctl start rabbitmq-server
    • 检查服务状态:sudo systemctl status rabbitmq-server,确保显示 active (running)
  • Windows 系统
    • 下载 RabbitMQ 的 Windows 安装包(可从官方网站获取)。
    • 安装完成后,在服务列表中找到 RabbitMQ 服务,手动启动它。

检查网络连接#

  • 可以使用 ping 命令来测试本地网络的基本连通性。虽然 ping 主要用于测试 IP 层的连通性,但如果 ping 127.0.0.1 都失败,那说明本地网络接口存在严重问题。
  • 对于更详细的网络检查,可以使用 telnet 命令(如果系统支持)。例如 telnet 127.0.0.1 5672,如果能成功连接(显示空白屏幕等),说明网络层基本正常;如果连接失败,则需要进一步排查网络问题。

配置防火墙或安全组#

  • Linux 防火墙(以 UFW 为例)
    • 允许 5672 端口通过:sudo ufw allow 5672
    • 检查防火墙规则:sudo ufw status
  • 云服务器安全组(以阿里云 ECS 为例)
    • 登录阿里云控制台,进入 ECS 实例管理页面。
    • 找到对应的实例,点击“本实例安全组”,然后点击“配置规则”。
    • 添加一条入方向规则,协议类型选择 TCP,端口范围填写 5672,授权对象可以根据实际需求(如果是本地开发测试,可暂时设置为 0.0.0.0/0,生产环境需谨慎设置)。

示例代码#

以下是一个简单的 amqplib 连接 RabbitMQ 的示例代码:

const amqp = require('amqplib');
 
async function main() {
  try {
    const connection = await amqp.connect('amqp://localhost:5672');
    const channel = await connection.createChannel();
    const queue = 'test_queue';
    await channel.assertQueue(queue, { durable: false });
    console.log('Connected successfully');
    await connection.close();
  } catch (error) {
    console.error('Error:', error);
  }
}
 
main();

如果在上述代码执行时不再出现 Error: connect ECONNREFUSED 127.0.0.1:5672 错误,说明连接问题已解决。

最佳实践#

  • 服务监控:在生产环境中,建议使用监控工具(如 Prometheus + Grafana 等)来实时监控 RabbitMQ 服务的运行状态,包括端口的可访问性等。
  • 错误处理:在代码中对连接错误进行更详细的处理,比如记录日志(可以使用 winston 等日志库),方便后续排查问题。
  • 环境隔离:开发、测试、生产环境的 RabbitMQ 配置(包括端口、用户权限等)要严格隔离,避免因配置混乱导致连接问题。

参考#