【问题标题】:WS proxy for firewalled ActiveMQ server防火墙 ActiveMQ 服务器的 WS 代理
【发布时间】:2015-06-27 18:06:17
【问题描述】:
有没有办法让浏览器客户端通过 Tomcat/Jetty 服务器通过 websockets 进行连接,并将 JMS 连接传递给 ActiveMQ 服务器?
我们希望将我们的 JMS 服务器保留在防火墙后面,但允许已经连接到我们的 Tomcat 应用程序服务器的客户端通过 websockets 连接到 ActiveMQ,并认为同一主机。
【问题讨论】:
标签:
tomcat
servlets
websocket
jms
activemq
【解决方案1】:
JMS 是客户端 API,而不是协议。
使用 ActiveMQ JMS 客户端,您将使用 OpenWire,它不能通过 websocket 发送(没有主要的编码练习)。您可以做的是代理一种实际上与 websocket 配合良好的传输方式 - MQTT 或 STOMP。
我建议在您的 Web 应用程序 (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;
}
}