通过Nginx连接RabbitMQ

7nbnzgx9  于 2023-01-25  发布在  Nginx
关注(0)|答案(6)|浏览(153)

我正在尝试设置rabbitmq,它可以通过nginx从外部访问(从非本地主机)。
nginx-rabbitmq.conf:

server {
    listen       5672;
    server_name  x.x.x.x;
    location / {
        proxy_pass http://localhost:55672/;
    }
}

rabbitmq.conf:

[
 {rabbit,
  [
   {tcp_listeners, [{"127.0.0.1", 55672}]}
  ]
 }
]

默认情况下,guest用户只能从localhost进行交互,因此我们需要创建另一个具有所需权限的用户,如下所示:

sudo rabbitmqctl add_user my_user my_password
sudo rabbitmqctl set_permissions my_user ".*" ".*" ".*"

然而,当我尝试通过pika连接到rabbitmq时,我收到ConnectionClosed异常

import pika
credentials = pika.credentials.PlainCredentials('my_username', 'my_password')
pika.BlockingConnection(
    pika.ConnectionParameters(host=ip_address, port=55672, credentials=credentials)
)

--[引发连接关闭异常]--
如果我使用相同的参数,但将host更改为localhost,将port更改为5672,则连接正常:pika.ConnectionParameters(host=ip_address, port=55672, credentials=credentials)
我已经在GCE Web控制台上打开了端口5672,并且正在通过nginx进行通信:nginx access.log文件显示
[30/2014年4月22日:59:41 +0000]“AMQP\x00\x00\x09\x01”400 172“-”“-”“-”
显示400状态代码响应(错误请求)。
因此,从外观上看,当通过nginx时请求失败,但当我们直接请求rabbitmq时可以工作。
有没有其他人遇到过类似的问题/让rabbitmq通过nginx为外部用户工作?有没有rabbitmq日志文件可以让我看到每个请求并帮助进一步排除故障?

rdlzhqv9

rdlzhqv91#

从nginx 1.9开始,就有了tcp或udp的流模块(默认情况下没有编译)。
我用SSL流配置了我的nginx(1.13.3)

stream {
    upstream rabbitmq_backend {
        server rabbitmq.server:5672
    }

    server {
        listen      5671 ssl;

        ssl_protocols           TLSv1.2 TLSv1.1 TLSv1;
        ssl_ciphers             RC4:HIGH:!aNULL:!MD5;
        ssl_handshake_timeout   30s;

        ssl_certificate       /path/to.crt;
        ssl_certificate_key   /path/to.key;

        proxy_connect_timeout 1s;
        proxy_pass rabbitmq_backend;
    }
}

https://docs.nginx.com/nginx/admin-guide/security-controls/terminating-ssl-tcp/

at0kjp5o

at0kjp5o2#

您已经将nginx配置为HTTP反向代理,但是rabbitmq配置为使用AMQP协议(请参见https://www.rabbitmq.com/configure.html中对tcp_listener的描述)
为了让nginx做任何有意义的事情,您需要重新配置rabbitmq以使用HTTP -例如http://www.rabbitmq.com/web-stomp.html
当然,这可能会产生涟漪React,因为任何通过AMQP访问rabbitmq的客户机都必须重新配置/重新设计才能使用HTTP。

v1uwarro

v1uwarro3#

您可以尝试代理到tcp,为nginx安装一个tcp-proxy模块以便与AMQP一起工作。
https://github.com/yaoweibin/nginx_tcp_proxy_module
给予看。

u4vypkhs

u4vypkhs4#

Nginx最初只是HTTP服务器,我也建议研究一下上面提到的TCP代理模块,但是如果你想拥有经过验证的负载平衡器,这是通用的TCP反向代理(不仅仅是HTTP,而是可以处理任何协议),你可以考虑使用HAproxy。

zy1mlcev

zy1mlcev6#

我可能会迟到的党,但我非常肯定,我的文章一定会帮助很多人在未来几天。
在本文中,我解释了如何在端口上使用NGINX作为反向代理为RabbitMQ管理GUI安装Letsencrypt证书**:15672**,它在HTTP协议上运行。
我还使用了相同的SSL证书来启动运行在AMQP协议上的RabbitMQ Server
请阅读以下文章以了解详细说明:
https://stackcoder.in/posts/install-letsencrypt-ssl-certificate-for-rabbitmq-server-and-rabbitmq-management-tool

注意:不要将运行在端口5672上的RabbitMQ服务器配置为反向代理。即使您这样做,也请使用NGINX流。但我强烈建议坚持在rabbitmq.conf文件中添加证书路径,因为RabbitMQ在TCP/UDP上工作

相关问题