Azure虚拟机部署RabbitMQ后客户端连接失败问题排查
问题描述
通过Azure Marketplace创建部署在Windows Server 2016上的RabbitMQ Server实例(仅修改实例规格为Standard_B2s),已完成以下配置:
- 在Azure门户为虚拟机配置网络入站规则,开放80、443、15672、3389及5672端口;
- 通过远程桌面连接虚拟机,验证RabbitMQ服务正常运行,并新增拥有根虚拟主机(/)访问权限的管理员用户;
- 本地PC可通过浏览器访问
{virtual-machine-ip}:15672并登录管理界面。
但使用以下C#代码尝试连接时,抛出异常RabbitMQ.Client.Exceptions.BrokerUnreachableException: „None of the specified endpoints were reachable”,更换端口为5672或15672也无法解决,需找出缺失的配置项。
代码片段:
var factory = new ConnectionFactory() { HostName = "{vm-ip}", UserName = "{new-user}", Password = "{new-user-pass}", VirtualHost = "/", Port = 80 }; using var connection = factory.CreateConnection(); using var channel = connection.CreateModel();
缺失配置项及解决方法
1. 检查RabbitMQ监听绑定配置
默认情况下RabbitMQ仅监听localhost(127.0.0.1),外部客户端无法直接连接。需修改配置让其监听虚拟机的公网/内网IP或所有地址:
- 远程桌面进入虚拟机,定位到RabbitMQ配置目录(通常为
C:\Program Files\RabbitMQ Server\rabbitmq_server-{版本号}\etc\rabbitmq) - 若不存在
rabbitmq.conf文件则新建,添加配置:listeners.tcp.default = 0.0.0.0:5672(让5672端口监听所有网络地址) - 重启RabbitMQ服务:打开命令提示符,依次执行
rabbitmq-service stop和rabbitmq-service start
2. 配置Windows本地防火墙规则
Azure入站规则开放端口后,虚拟机自身的Windows防火墙可能仍拦截5672端口的外部连接:
- 在虚拟机的Windows防火墙中,创建新的入站规则,允许TCP协议的5672端口通过,应用于所有网络配置文件(域、专用、公网)
3. 使用正确的协议与端口
- 15672是RabbitMQ管理界面的HTTP端口,不能用于AMQP客户端连接;5672是AMQP协议的默认端口,客户端需使用该端口
- 修正后的代码应将Port设置为5672:
var factory = new ConnectionFactory() { HostName = "{vm-ip}", UserName = "{new-user}", Password = "{new-user-pass}", VirtualHost = "/", Port = 5672 // AMQP协议默认端口 }; using var connection = factory.CreateConnection(); using var channel = connection.CreateModel();
4. 验证用户权限完整性
尽管已给用户分配根虚拟主机权限,仍需确认权限是否完全生效:
- 登录
{vm-ip}:15672管理界面,进入「Admin」→「Users」,找到新建用户 - 检查「Permissions」区域,确认该用户对
/虚拟主机拥有configure、write、read三项完整权限,若缺失则重新配置
5. 排查网络连通性
在本地PC上测试端口连通性,确认网络层面无拦截:
- 打开PowerShell,执行
Test-NetConnection {vm-ip} -Port 5672 - 若返回
TcpTestSucceeded: False,需检查Azure入站规则的源地址范围(是否限制了特定IP,本地PC需在范围内)、规则优先级(是否被其他拒绝规则覆盖)
内容的提问来源于stack exchange,提问作者Wojciech X
相关产品推荐
相关产品推荐

