現在、WebSocketを広範囲に使用するJBoss/WildflyにデプロイされるJavaEE7アプリケーションを開発中です。 Webソケットのサポートにmod_proxy_wstunnel
を使用しており、Apache2.4でmod_cluster
を使用することで、プロキシ構成を起動して実行することができました。
インターネット-> Apache HTTPD-> Wildfly
現在、このアプリケーションのクラスタリングの問題に直面しています。パフォーマンスのスケーラビリティと高可用性の両方のために、少なくとも4つのノードが稼働します。これを実現するために、2つのメンバーサーバーで<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>
ただし、これは機能しません。パスhttp://localhost/ws
でWebソケットを開こうとすると、JavaScriptで常に接続エラーが発生します。 mod_proxy_balancer
のドキュメントをざっと見てみると、HTTP、FTP、およびAJP13プロトコルのサポートが宣言されていることがわかりました。 WebソケットとWSプロトコルの負荷を分散する方法はありますか?それとも、これは完全にサポートされていない構成ですか?これを達成するために他にどのような選択肢を活用できますか?明らかに、単一の障害点を表すため、本番エンドポイントとして単一のWebソケットサーバーを使用することは受け入れられません。アドバイスをいただければ幸いです。
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コンテキストです。
2.4.5以降、mod_proxyにWebSocket(ws://)およびセキュアWebSocket(wss://)プロトコルのサポートを提供するmod_proxy_wstunnelモジュールがあります。ただし、以前のバージョン(PR55320)のバグのため、wssは2.4.10以降でのみ使用できます。
ドキュメントに明示的に記載されていませんが、他のサポートされているプロトコルと同様に、ws(s)プロトコルをmod_proxy(およびmod_proxy_balancer)で使用できます。 mod_proxy_wstunnelが実際にロードされていることを確認してください。
説明から、Apacheログに使用可能なエラーがあるかどうかは明確ではありません。 Webアプリケーションが/ws
にのみアクセスすることを確認しますか?パスの不一致がある可能性があります。WebSocketサーバーでは/ws/anything
が/MyContextPath/myWebSocketEndpoint/anything
になりますが、これはおそらく意図したものではありません。
これが事実である場合、あなたはむしろ必要です:
<Proxy balancer://myBalancer>
BalancerMember ws://localhost:9080
BalancerMember ws://localhost:19080
</Proxy>
RewriteEngine On
RewriteRule /ws(/.*)? balancer://myBalancer/MyContextPath/myWebSocketEndpoint [P,L]
これがApache + mod_proxyで実行できるかできないかはわかりません。
Apacheの代替として、負荷分散とWebsocketサポートを提供する他の商用ソリューションがあります。 ShakaTechnologiesのIshlanguLoad Balancer ADCは透過的な(ゼロ構成)WebSocketをサポートします 。 F5 BIG-IP もそうだと思います。