通过Nginx连接RabbitMQ

时间:2014-04-30 23:09:10

标签: nginx rabbitmq amqp

我正在尝试设置rabbitmq,可以通过nginx从外部(从非localhost)访问它。

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}]}
  ]
 }
]

默认情况下,访客用户只能从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)
)

- [引发ConnectionClosed异常] -

如果我使用相同的参数但是将主机更改为localhost并将端口更改为5672,那么我连接ok: pika.ConnectionParameters(host=ip_address, port=55672, credentials=credentials)

我在GCE Web控制台上打开了端口5672,并且正在通过nginx进行通信:nginx access.log文件显示

[30 / Apr / 2014:22:59:41 +0000]" AMQP \ x00 \ x00 \ x09 \ x01" 400 172" - " " - " " - "

显示400状态代码响应(错误请求)。

因此看起来请求在通过nginx时失败,但在我们直接请求rabbitmq时有效。

有没有其他人遇到过类似的问题/让rabbitmq通过nginx为外部用户工作?是否有一个rabbitmq日志文件,我可以在其中查看每个请求并帮助进一步排除故障?

5 个答案:

答案 0 :(得分:6)

您已将nginx配置为HTTP反向代理,但Rabbitmq配置为使用AMQP协议(请参阅https://www.rabbitmq.com/configure.html处的tcp_listeners说明)

为了让nginx做任何有意义的事情,你需要重新配置rabbitmq以使用HTTP - 例如http://www.rabbitmq.com/web-stomp.html

当然,这可能会产生连锁反应,因为任何通过AMQP访问rabbitmq的客户端都必须重新配置/重新设计才能使用HTTP。

答案 1 :(得分:4)

您可以尝试代理到tcp,为nginx安装tcp-proxy模块以使用AMQP。

https://github.com/yaoweibin/nginx_tcp_proxy_module

试一试。

答案 2 :(得分:3)

从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/

答案 3 :(得分:1)

Nginx最初只是HTTP服务器,我也建议查看上面提到的tcp代理模块,但是如果你想要经过验证的负载均衡器,这是一般的TCP反向代理(不仅仅是HTTP,而且可以处理任何协议)通常),您可以考虑使用HAproxy。

答案 4 :(得分:0)

由于 amqp 处于 tcp/udp 级别,因此您需要为 tcp/udp 连接配置 nginx https://docs.nginx.com/nginx/admin-guide/load-balancer/tcp-udp-load-balancer