如何使用 Nginx 作为 RabbitMQ 的 websocket 功能的反向代理?

Posted

技术标签:

【中文标题】如何使用 Nginx 作为 RabbitMQ 的 websocket 功能的反向代理?【英文标题】:How can I use Nginx as a reverse proxy to my RabbitMQ's websocket function? 【发布时间】:2016-07-29 09:33:47 【问题描述】:

我已经通过关注this 启用了 RabbitMQ 的 Web-Stomp 插件,因为我们需要 STOMP over WebSockets,并且它可以工作。现在我需要一个 nginx 服务器作为我的 RabbtMQ 服务器前面的反向代理。 以下是来自 Nginx 服务器的配置部分。

http 

    upstrem websocket 
            # this is the actual rabbitmq server address
            server 15.15.181.73:15674 
    

    server 
            # the nginx server addres is 15.15.182.108
            listen 80 default_server;
            listen [::]:80 default_server ipv6only=on;

    location /ws/ 
                proxy_pass http://websocket;
                proxy_http_version 1.1;
                proxy_set_header Upgrade websocket;
                proxy_set_header Connection upgrade;
            
    

这是访问服务器的 javascript 代码

var WebSocket = require('ws');
var Stomp = require('stompjs');
var ws = new WebSocket('ws://15.15.182.108/ws', 
  protocolVersion: 8,
  origin: 'http://15.15.182.108/ws',
  rejectUnauthorized: false
);

var client = Stomp.over(ws);
var on_connect = function()


        client.send("/queue/test", priority: 9, "Hello, STOMP for /queue/test");

;

var on_error = function(error)
    console.log("error");
    console.log(error.headers.message);
;

client.connect('test','test',on_connect,on_error,'/');

现在让我困惑的是,如果我需要通过Websockets访问rabbitmq服务器,那么我应该在ip地址后面附加/ws,如果我直接访问它就可以了。但是,我似乎无法将/ws放在Nginx配置文件中的ip地址后面的upstream部分。那么,如果我需要完成这项工作,我该怎么办?谢谢。

【问题讨论】:

【参考方案1】:

你可以试试nginx stomp,它支持rabbit mq等。它是nginx模块

# nginx.conf

server 
    ....
    location /sendqueue 
       stomp_pass stomp;
       stomp_command SEND;
       stomp_headers "destination:/amq/queue/stompqueue
                      persistent:false
            content-type:text/plain
                      content-length:38";
       stomp_body "This is new message sending from stomp";
    

【讨论】:

【参考方案2】:

我不确定这是否有帮助,但您在附加的 sn-p 中上游拼写错误。

 upstrem websocket 
            # this is the actual rabbitmq server address
            server 15.15.181.73:15674 
    

应该是:

 upstream websocket 
            # this is the actual rabbitmq server address
            server 15.15.181.73:15674 
    

编码愉快!

【讨论】:

以上是关于如何使用 Nginx 作为 RabbitMQ 的 websocket 功能的反向代理?的主要内容,如果未能解决你的问题,请参考以下文章

使用Zabbix监控RabbitMQ

Kubernetes nginx ingress rabbitmq 管理和kibana

如何快速查看 rabbitmq 指定的配置

使用Zabbix监控RabbitMQ

如何使用 spring-rabbit 配置 RabbitMQ 连接?

rabbitmq web页面配置搞定nginx代理