我们正在开发一个JavaEE 7应用程序来部署在JBoss / Wildfly上,它将广泛使用Web Sockets。 我们使用mod_proxy_wstunnel来支持web套接字,并且我们设法通过在Apache 2.4上使用mod_cluster来启动并运行代理configuration:
Internet – > Apache HTTPD – > Wildfly
我们现在正面临着这个应用程序集群化的问题。 我们将至less有4个节点启动并运行,以实现性能可扩展性和高可用性。 我试图用2个成员服务器创build一个<Proxy />元素来完成这个任务。 它看起来像这样:
<VirtualHost *:80> ... <Proxy balancer://myBalancer> BalancerMember ws://localhost:9080 BalancerMember ws://localhost:19080 </Proxy> <Location /ws> ... ProxyPass balancer://myBalancer/MyContextPath/myWebSocketEndpoint ProxyPassReverse balancer://myBalancer/MyContextPath/myWebSocketEndpoint </Location> </VirtualHost>
但是,这是行不通的。 尝试打开path为http://localhost/ws的Web套接字时,我总是收到JavaScript中的连接错误。 我快速浏览了mod_proxy_balancer的文档,注意到它声明了对HTTP,FTP和AJP13协议的支持。 有没有办法负载平衡Web套接字和WS协议? 或者这是完全不受支持的configuration? 我可以利用其他什么方法来实现这个目标? 显然,将单个networking套接字服务器作为我们的生产端点是不可接受的,因为它代表了单点故障。 我非常感谢你的build议!
根据Apache官方文档: https : //httpd.apache.org/docs/2.4/en/mod/mod_proxy_balancer.html
mod_proxy_balancer需要mod_proxy的服务,并为所有支持的协议提供负载均衡。 最重要的是:
定义您的平衡器:
<Proxy balancer://wsBalancer> BalancerMember ws://host1:9080 route=jvm1 BalancerMember ws://host2:9080 route=jvm2 ProxySet lbmethod=byrequests stickysession=JSESSIONID </Proxy>
然后让ws电话去那个平衡器:
<LocationMatch "^/cometd/.*"> ProxyPass "balancer://wsBalancer/" stickysession=JSESSIONID </LocationMatch>
这里/ cometd /是应用程序的WS上下文。
我不确定这是否可以用Apache + mod_proxy完成。
至于Apache的替代品,还有其他商业解决scheme提供负载均衡和WebSocket支持。 Shaka Technologies的Ishlangu负载平衡器ADC支持透明(零configuration)websocket 。 我相信F5 BIG-IP也是如此。
从2.4.5开始,mod_proxy_wstunnel模块为mod_proxy提供了WebSocket(ws://)和安全的WebSocket(wss://)协议支持。 然而,由于早期版本(PR55320)中的错误,wss仅适用于2.4.10以上版本。
即使没有在文档中明确提到,也可以像使用其他任何支持的协议一样,使用ws(s)协议和mod_proxy(和mod_proxy_balancer)。 只要确保mod_proxy_wstunnel实际上被加载了。
从描述中不清楚Apache日志中是否有可用的错误。 你确定你的Web应用程序只访问/ws ? 有可能是一个path不匹配, /ws/anything将最终作为/MyContextPath/myWebSocketEndpoint/anything在您的WebSocket服务器可能不是你想要的。
如果是这样的话,你宁愿需要:
<Proxy balancer://myBalancer> BalancerMember ws://localhost:9080 BalancerMember ws://localhost:19080 </Proxy> RewriteEngine On RewriteRule /ws(/.*)? balancer://myBalancer/MyContextPath/myWebSocketEndpoint [P,L]