防火墙ActiveMQ服务器的WS代理

时间:2015-04-20 20:21:29

标签: tomcat servlets websocket jms activemq

浏览器客户端是否有办法通过websockets通过Tomcat / Jetty服务器连接并将JMS连接传递给ActiveMQ服务器?

我们希望将我们的JMS服务器保留在防火墙之后,但允许已连接到我们的Tomcat应用程序服务器的客户端通过认为同一主机的websockets连接到ActiveMQ。

1 个答案:

答案 0 :(得分:2)

JMS是客户端API,而不是协议。

使用ActiveMQ JMS客户端,您将使用OpenWire,它不能通过websocket发送(没有主要的编码练习)。您可以做的是代理其中一个实际上与websockets兼容的传输 - MQTT或STOMP。

我建议在你的网络应用程序(tomcat)和ActiveMQ前面使用一些轻量级反向代理。这可能是Apache httpd或Nginx。即使没有websockets,使用一些经过强化处理的Web代理保护您的Java服务器也是一个好主意。

我已经通过WebSocket上的Web服务器Nginx和MQTT做了这样的事情,它运行得很好。虽然我猜Stomp over WebSocket没什么区别。不错的是,您还可以在代理服务器中轻松终止SSL,这通常比在应用服务器中更快/更容易。

这对在客户端使用JMS api没有帮助。不确定是否有任何生产准备就绪。但是,跳过JMS规范并在Websocket客户端上使用STOMP应该这样做。

示例Nginx配置代理WebSocket(在这种情况下终止SSL / TLS),例如ActiveMQ服务器。

upstream websocket {
    server example.com:61623;
}
server {
    listen 8883 ssl;
    ssl on;
    ssl_certificate /etc/nginx/ssl/bundle2015.cer;
    ssl_certificate_key /etc/nginx/ssl/server2015.key;

    location / {
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade websocket;
        proxy_set_header Connection upgrade;
        proxy_read_timeout 120s;
    }
}