現在、Tomcat サーバーにデプロイされている websocket アプリケーションを開発しています。ユーザー数が非常に多いため、ワークロードを複数の Tomcat インスタンスに分散したいと考えています。負荷分散には Apache を使用することにしました。
現在、Websockets リクエストの Apache ロード バランシングとスティッキー セッションの実装に問題があります。これは私のApache構成です:
ProxyRequests off
SSLProxyEngine on
RewriteEngine On
<Proxy balancer://http-localhost/>
BalancerMember https://mcsgest1.desy.de:8443/Whiteboard/ route=jvm1 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
BalancerMember https://mcsgest1.desy.de:8444/Whiteboard/ route=jvm2 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
ProxySet lbmethod=byrequests
ProxySet stickysession=JSESSIONID|sid scolonpathdelim=On
</Proxy>
<Proxy balancer://ws-localhost/>
BalancerMember wss://mcsgest1.desy.de:8443/Whiteboard/ route=jvm1 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
BalancerMember wss://mcsgest1.desy.de:8444/Whiteboard/ route=jvm2 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
ProxySet lbmethod=byrequests
ProxySet stickysession=JSESSIONID|sid scolonpathdelim=On
</Proxy>
RewriteCond %{HTTP:Upgrade} =websocket
RewriteRule /jddd/(.*) balancer://ws-localhost/$1 [P,L]
ProxyPassReverse /jddd/ balancer://ws-localhost/
RewriteCond %{HTTP:Upgrade} !=websocket
RewriteRule /jddd/(.*) balancer://http-localhost/$1 [P,L]
ProxyPassReverse /jddd/ balancer://http-localhost/
最初の https 要求はポート 8443 に分散されます。アップグレードされた wss 要求も 8443 に転送されます。
2 番目の https 要求には、最初の要求のセッション ID が含まれています: https://...&sid=C28C13EEEC525D203F8CA4E827605E0B.jvm1
Apache ログ ファイルで確認できるように、このセッション ID は stickySession に対して評価されます。
...stickysession sid の値 C28C13EEEC525D203F8CA4E827605E0B.jvm1 が見つかりました
...見つかったルート jvm1
...balancer://http-localhost: ワーカー (htttps://mcsgest1.desy.de:8443/Whiteboard/) が htttps://mcsgest1.desy.de:8443/Whiteboard//?file=octocenter に書き換えられました。 xml&address=///&sid=C28C13EEEC525D203F8CA4E827605E0B.jvm1
2 番目の https 要求はポート 8443 のままですが、websocket プロトコルにアップグレードした後、ws-balancer は sessionID を評価せず、8444 に書き換えます。
...balancer://ws-localhost: ワーカー (wss://mcsgest1.desy.de:8444/Whiteboard/) が wss://mcsgest1.desy.de:8444/Whiteboard//whiteboardendpoint に書き換えられました
wss プロトコルでも stickysession を有効にするには、Apache 構成で何を変更する必要がありますか? Websocket のバランスを取るには、本当に 2 つのバランサー (http と ws) が必要ですか?