web-dev-qa-db-ja.com

Apache WebサーバーとTomcatサーバーとのスティッキーセッション

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> 
17
ihavprobs

Apache httpdがセッションを同じバックエンドに関連付けるためには、どのcookieがセッションIDを保持するかを知る必要があります。 Javaの場合、これは(通常)[〜#〜] jsessionid [〜#〜]です。

ProxyPassディレクティブを使用している場合は、

ProxyPass /example http://backend.example.com stickysession=JSESSIONID

優れたApache httpdドキュメント にあります。

11
Joeri Hendrickx

これは私のために働いた...

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

これは解決するのがとても面倒なので、Apacheのドキュメントに追加する必要があります。

17
Radoslav Lang

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">
6
Manish Gupta

これは私が遭遇した問題でもあります。vhost内でバランサーを定義すると、文書化されているとおりにstickysessionを使用するようになります。ただし、vhostの外部で使用されているバランサーを定義している場合は、stickysessionが失われるため、バランサー自体の中でProxySetを使用して設定する必要があります。

2
Wilb

上記の解決策はどれもうまくいきませんでしたが、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>
0
NullIsNot0

あなたの問題は、あなたがあなたがあなたのバランスバランサーを持っているところでmybalancerを使っていることだと思います:

ProxyPass /myapp/ balancer://mybalancer/ stickysession=JSESSIONID
0
amp