Apache + Tomcat - Problèmes avec les sessions et l'équilibrage de la charge

Je suis confronté à quelques problèmes avec Apache mod_proxy_balancer concernant les sessions persistantes.

Nous avons développé un service web restful en Java, en cours d'exécution sur Tomcat. La réelle backend est à l'aide de Acegi security, avec Authentification l'authentification de Base.

L'architecture est (désolé, je suis un nouvel utilisateur, je ne peux pas poster d'images) :

     --------------------
     |Java Reverse Proxy|
     --------------------
            |
     --------------------
     |Apache load balancer|
     --------------------               
            |
    -------- | --------
    |               |
--------        --------    
|tomcat1|       |tomcat2|
--------        --------    

Nous avons cette "Java Reverse Proxy" pour effectuer diverses affaires les choses. Il le fait aussi à la Base d'Authentification l'authentification sur le serveur Tomcat (Tomcat1, Tomcat2).

L'utilisateur final appels url comme : http:///a/b?username=foo&mot de passe=bar&session=xxx

Le reverse proxy puis procurations de la demande à Apache, envoyer le long les informations d'identification de Base Auth jetons.

L'utilisateur final a trois différentes url:

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

Seulement de service1 et service2 sont protégés par Acegi. service3 est anonyme accessible (c'est une obligation).

Nous avons ont la configuration suivante dans Apache pour effectuer l'équilibrage de la charge:

<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

Sur le premier appel à service1, puis JSESSIONID est renvoyé à l'utilisateur, puis il envoie les informations de session dans le cadre de la demande (dans la chaîne de requête, session paramètre)

De maintenir des séances d'états dans le backend matous (tomcat1, tomcat2), la java reverse proxy obtient la session à partir de la chaîne de requête et l'envoie vers le serveur mandaté matous comme un cookie JSESSIONID.

Tout fonctionne parfaitement bien pour les URL qui sont auth basic protégé. Mais ensuite, lorsque l'utilisateur appelle le troisième url (qui est publiquement disponible), Apache ne pas effectuer l'équilibrage de la charge correctement.

Par exemple, lorsque j'appelle le service 1 ou 2, j'ai le logs 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

Qui est parfaitement bien, que la demande vise tomcat2.

Mais alors quand je l'appelle service3, j'obtiens :

[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

Comme vous pouvez le voir, même si le cookie JSESSIONID est le même, Apache envoie la demande à la mauvaise tomcat (ici tomcat1).

Pourrait-il être le fait que l'url de service3 ne nécessite pas d'Authentification l'authentification de Base, wherease de service1 et service2 faire ?

Je suis assez sûr que j'ai fait quelque chose de mal, mais j'ai été en regardant autour pour une longue période de temps, et je ne peux pas le faire fonctionner.

Votre aide est très apprécié.

Grâce

OriginalL'auteur benjamin.d | 2012-02-22