スティッキーセッションに関して、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が必要なのは事実でしょうか?
私は何か間違ったことをしたと確信していますが、私は長い間見回していて、それを機能させることができません。
あなたの助けは非常にありがたいです。
ありがとう
JSESSIONIDにjvmRouteサフィックスが表示されません。 mod_proxyは、jvmRouteを使用して、スティッキーセッションをTomcatインスタンスに正しくルーティングします。 jvmRouteは、Tomcatサーバー構成で宣言されます(各サーバーインスタンスには独自のjvmRoute識別子があります。
私は同じ問題に直面していて、以下の行を変更することでそれを解決しました-
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
多分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"}">