Apacheの背後にある2つのTomcatインスタンスのロードバランサーとしてApache Webサーバーを使用しています。最初のリクエストがノードAに送られ、同じクライアントからの2番目のリクエストがノードBに送られるとき、ノードA内のセッション変数にアクセスできません。それは明らかです。私はインターネットでサーフィンをしましたが、スティッキーセッションを有効にすると役立つことがわかりました。しかし、Apacheでスティッキーセッションを有効にするためのすべてのチュートリアルは混乱しているように見えます。これのための簡単なステップバイステップのチュートリアルはありますか?助けてください。
コメントのコードフラグメント:
ProxyPass /balancer-manager !
ProxyPass /balancer://mycluster/ stickysession=JSESSIONID
ProxyPassReverse /balancer://mycluster/
<Proxy balancer://mycluster>;
BalancerMember ajp://localhost:9001/ route=NodeA1000 retry=10
BalancerMember ajp://localhost:9002/ route=NodeB1000 retry=10
</Proxy>
Apache httpdがセッションを同じバックエンドに関連付けるためには、どのcookieがセッションIDを保持するかを知る必要があります。 Javaの場合、これは(通常)[〜#〜] jsessionid [〜#〜]です。
ProxyPass
ディレクティブを使用している場合は、
ProxyPass /example http://backend.example.com stickysession=JSESSIONID
優れたApache httpdドキュメント にあります。
これは私のために働いた...
ProxyPassディレクティブでstickysession = JSESSIONIDを使用する代わりに、ProxySet stickysession = JSESSIONIDを使用してバランサー構成内で設定する必要があります。
<Proxy balancer://mybalancer>
BalancerMember ajp://server1:8009 route=Tomcat1
BalancerMember ajp://server2:8009 route=Tomcat2
ProxySet lbmethod=bytraffic
ProxySet stickysession=JSESSIONID
</Proxy>
ProxyPass /myapp/ mybalancer://myapp/
以下に示すように、ProxyPassで使用していたとき、それは動作していないでした。
ProxyPass /myapp/ mybalancer://myapp/ stickysession=JSESSIONID
Plsはこれを試します、これはあなたのために働くと確信しています。
ステップ-1:以下のコードをhttpd.confに追加します。
<Proxy balancer://mycluster>
BalancerMember http://<NODE1>/<APP>/ route=jvm1
BalancerMember http://<NODE2>/<APP>/ route=jvm2
ProxySet lbmethod=bytraffic
ProxySet stickysession=JSESSIONID
</Proxy>
ProxyPass /<APP>/ balancer://mycluster/
ProxyPassReverse /<APP>/ balancer://mycluster/
ステップ-2:server.confに以下のコードを追加します。
a) <NODE1>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
b) <NODE2>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">
これは私が遭遇した問題でもあります。vhost内でバランサーを定義すると、文書化されているとおりにstickysessionを使用するようになります。ただし、vhostの外部で使用されているバランサーを定義している場合は、stickysessionが失われるため、バランサー自体の中でProxySetを使用して設定する必要があります。
上記の解決策はどれもうまくいきませんでしたが、MOTECHプロジェクトのドキュメントで見つけました: http://docs.motechproject.org/en/latest/deployment/sticky_session_Apache.html
この構成は私のために動作します(Apache 2.4.41上):
<VirtualHost *:80>
(...)
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
(...)
<Proxy balancer://mycluster>
(...)
BalancerMember http://10.20.30.40:8080 route=backend-1 enablereuse=On
BalancerMember http://10.20.30.41:8080 route=backend-2 enablereuse=On
ProxySet lbmethod=bytraffic
ProxySet stickysession=ROUTEID
(...)
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
(...)
</VirtualHost>
あなたの問題は、あなたがあなたがあなたのバランスバランサーを持っているところでmybalancerを使っていることだと思います:
ProxyPass /myapp/ balancer://mybalancer/ stickysession=JSESSIONID