14

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

Tomcatで実行されるJavaでRESTfulWebサービスを開発しました。実際のバックエンドは、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は必要です。

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

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

ありがとう

4

3 に答える 3

6

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

于 2012-02-24T15:54:34.520 に答える
1

多分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"}">
于 2013-09-26T17:58:33.657 に答える
1

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

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

于 2014-04-16T13:18:58.910 に答える