web-dev-qa-db-ja.com

Apache + Tomcat-スティッキーセッションとロードバランシングの問題

スティッキーセッションに関して、Apachemod_proxy_balancerでいくつかの問題に直面しています。

Tomcatで実行される安らかなWebサービスをJavaで開発しました。実際のバックエンドは、AuthBasic認証を使用したAcegiセキュリティを使用しています。

アーキテクチャは次のとおりです(申し訳ありませんが、私は新しいユーザーです。画像を投稿できません):

     --------------------
     |Java Reverse Proxy|
     --------------------
            |
     --------------------
     |Apache load balancer|
     --------------------               
            |
    --------|--------
    |               |
--------        --------    
|Tomcat1|       |Tomcat2|
--------        --------    

この「Javaリバースプロキシ」は、さまざまなビジネスを実行するためのものです。また、Tomcat(Tomcat1、Tomcat2)で基本認証認証を行います。

エンドユーザーは次のようなURLを呼び出します:http:/// a/b?username = foo&password = bar&session = xxx

次に、リバースプロキシはリクエストをApacheにプロキシし、認証情報を基本認証トークンとして送信します。

エンドユーザーには3つの異なるURLがあります。

http://<Java reverse proxy domain>/service1
http://<Java reverse proxy domain>/service2
http://<Java reverse proxy domain>/service3

Service1とservice2のみがAcegiによって保護されます。 service3は匿名でアクセスできます(これは要件です)。

負荷分散を実行するために、Apacheには次の構成があります。

<Proxy balancer://cluster>
    Header set Cache-Control no-cache
    Header set Pragma no-cache
    BalancerMember http://xxx:9671 route=server1
    BalancerMember http://xxx:9672 route=server2
</Proxy>

ProxyPreserveHost On
ProxyPass / balancer://cluster/ stickysession=JSESSIONID
ProxyPassReverse / balancer://cluster/ stickysession=JSESSIONID

Service1への最初の呼び出しで、JSESSIONIDがユーザーに返され、ユーザーはこのセッション情報を要求の一部として(クエリ文字列、セッションパラメーターで)送信します。

バックエンドtomcat(Tomcat1、Tomcat2)でセッション状態を維持するために、Javaリバースプロキシはクエリ文字列からセッションを取得し、それをJSESSIONIDCookieとしてプロキシされたtomcatに送信します。

認証基本保護されているURLでは、すべてが完全に正常に機能します。ただし、ユーザーが3番目のURL(公開されている)を呼び出すと、Apacheは負荷分散を正しく実行しません。

たとえば、サービス1または2を呼び出すと、次のApacheログが取得されます。

[Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(280): proxy: BALANCER: Found value "3FB8F8135173BBBE78E5E4BBD6F5C8FB" for stickysession JSESSIONID
[Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(1003): proxy: Entering byrequests for BALANCER (balancer://cluster)
[Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(1046): proxy: byrequests selected worker "http://xxx:9672" : busy 0 : lbstatus 1

リクエストはTomcat2をターゲットにすることを目的としているため、これはまったく問題ありません。

しかし、service3を呼び出すと、次のようになります。

[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(280): proxy: BALANCER: Found value "3FB8F8135173BBBE78E5E4BBD6F5C8FB" for stickysession JSESSIONID
[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(1003): proxy: Entering byrequests for BALANCER (balancer://cluster)
[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(1046): proxy: byrequests selected worker "http://xxx:9671" : busy 0 : lbstatus 0

ご覧のとおり、JSESSIONID cookieが同じであっても、Apacheは要求を間違ったTomcat(ここではTomcat1)に送信します。

Service3のURLがAuthBasic認証を必要としないのに、service1とservice2が必要なのは事実でしょうか?

私は何か間違ったことをしたと確信していますが、私は長い間見回していて、それを機能させることができません。

あなたの助けは非常にありがたいです。

ありがとう

14
benjamin.d

JSESSIONIDにjvmRouteサフィックスが表示されません。 mod_proxyは、jvmRouteを使用して、スティッキーセッションをTomcatインスタンスに正しくルーティングします。 jvmRouteは、Tomcatサーバー構成で宣言されます(各サーバーインスタンスには独自のjvmRoute識別子があります。

6
Peter Cetinski

私は同じ問題に直面していて、以下の行を変更することでそれを解決しました-

ProxyPass /test balancer://mycluster stickysession=JSESSIONID|jsessionid scolonpathdelim=On
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.2:80 route=node1
BalancerMember http://192.168.1.3:80 route=node2
</Proxy>

構成に注意してくださいscolonpathdelim =参照中- http://httpd.Apache.org/docs/2.2/mod/mod_proxy_balancer.html

1
Munish Chandel

多分tisが役立つでしょう。これは、Webサーバーでの私の構成です。

<Proxy balancer://hybriscluster>
BalancerMember ajp://tomcatServer1:8009 route=Tomcat1 keepalive=On ping=5 max=200 ttl=120
BalancerMember ajp://tomcatServer2:8009 route=Tomcat2 keepalive=On ping=5 max=200 ttl=120
ProxySet stickysession=JSESSIONID|jsessionid lbmethod=byrequests timeout=60
</Proxy>

Tomcatサーバー1のserver.xmlの構成:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat1"}">
0
user1019100