スティッキーセッションに関して、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は必要です。
私は何か間違ったことをしたと確信していますが、私は長い間見回していて、それを機能させることができません。
あなたの助けは非常にありがたいです。
ありがとう