web-dev-qa-db-ja.com

mod_proxy_wstunnel用のApacheロードバランサー?

現在、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ソケットサーバーを使用することは受け入れられません。アドバイスをいただければ幸いです。

3
Shadowman

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>

次に、ws呼び出しをそのバランサーに到達させます。

<LocationMatch "^/cometd/.*">
    ProxyPass "balancer://wsBalancer/" stickysession=JSESSIONID
</LocationMatch>   

ここで/ cometd /はアプリケーションのWSコンテキストです。

2
user380440

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]
0
PeterPramb

これがApache + mod_proxyで実行できるかできないかはわかりません。

Apacheの代替として、負荷分散とWebsocketサポートを提供する他の商用ソリューションがあります。 ShakaTechnologiesのIshlanguLoad Balancer ADCは透過的な(ゼロ構成)WebSocketをサポートしますF5 BIG-IP もそうだと思います。

0
Brendt Lucas