mod_proxy_wstunnel 的 Apache 负载均衡器?

Sha*_*man 3 cluster jboss socket apache-2.4 wildfly8

我们正在开发一个要部署在 JBoss/Wildfly 上的 JavaEE 7 应用程序,该应用程序将广泛使用 Web 套接字。我们正在使用Web 套接字支持,并且我们已经成功通过在 Apache 2.4 上mod_proxy_wstunnel使用来启动并运行代理配置:mod_cluster

互联网 -> Apache HTTPD -> Wildfly

我们现在面临着对该应用程序进行集群的问题。我们将至少有 4 个节点启动并运行,以实现性能可扩展性和高可用性。我尝试创建一个<Proxy />具有 2 个成员服务器的元素来完成此任务。它看起来像这样:

<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>
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用。当尝试打开路径上的网络套接字时,我总是在 JavaScript 中遇到连接错误http://localhost/ws。我快速浏览了一下文档mod_proxy_balancer,发现它声明支持 HTTP、FTP 和 AJP13 协议。有没有办法对 Web 套接字和 WS 协议进行负载平衡?或者这是一个完全不受支持的配置?我还可以利用哪些其他替代方案来实现这一目标?显然,使用单个 Web 套接字服务器作为我们的生产端点是不可接受的,因为它代表了单点故障。我非常感谢您提供的任何建议!

小智 5

根据Apache官方文档: https://httpd.apache.org/docs/2.4/en/mod/mod_proxy_balancer.html

mod_proxy_balancer 需要 mod_proxy 的服务,它为所有支持的协议提供负载平衡。最重要的是:

  • HTTP,使用 mod_proxy_http
  • FTP,使用 mod_proxy_ftp
  • AJP13,使用 mod_proxy_ajp
  • WebSocket,使用 mod_proxy_wstunnel

定义你的平衡器:

<Proxy balancer://wsBalancer>
    BalancerMember ws://host1:9080 route=jvm1
    BalancerMember ws://host2:9080 route=jvm2
    ProxySet lbmethod=byrequests stickysession=JSESSIONID
</Proxy>
Run Code Online (Sandbox Code Playgroud)

然后让 ws 调用到达该平衡器:

<LocationMatch "^/cometd/.*">
    ProxyPass "balancer://wsBalancer/" stickysession=JSESSIONID
</LocationMatch>   
Run Code Online (Sandbox Code Playgroud)

其中 /cometd/ 是应用程序的 WS 上下文。