Sto affrontando alcuni problemi con Ap_Pass_proxy_balancer riguardo le sessioni persistenti.Apache + Tomcat - Problemi con sessioni appiccicose e bilanciamento del carico
Abbiamo sviluppato un restful webservice in Java, in esecuzione su Tomcat. Il back-end effettivo utilizza la sicurezza Acegi, con autenticazione Auth Basic.
L'architettura è (scusate io sono un nuovo utente, non posso postare le immagini):
--------------------
|Java Reverse Proxy|
--------------------
|
--------------------
|Apache load balancer|
--------------------
|
--------|--------
| |
-------- --------
|tomcat1| |tomcat2|
-------- --------
Abbiamo questo "Java Reverse Proxy" per eseguire varie cose di business. Esegue anche l'autenticazione Basic Auth sul Tomcat (Tomcat1, Tomcat2).
L'utente finale chiamate URL del tipo: http: /// a/b username = pippo & password = bar & session = xxx
Il proxy inverso quindi proxy la richiesta al Apache, l'invio lungo le credenziali come token di autenticazione di base.
L'utente finale ha tre diversi indirizzi:
http://<java reverse proxy domain>/service1
http://<java reverse proxy domain>/service2
http://<java reverse proxy domain>/service3
Solo service1 e service2 sono protetti tramite Acegi. service3 è accessibile in modo anonimo (questo è un requisito).
abbiamo la seguente configurazione di Apache per eseguire il bilanciamento del carico:
<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
Sulla prima chiamata a Service1, quindi JSESSIONID viene restituito per l'utente, e poi invia queste informazioni come parte della sessione della richiesta (nella stringa di query, parametro di sessione)
Per mantenere gli stati delle sessioni nei backend tomcats (tomcat1, tomcat2), il proxy inverso java ottiene la sessione dalla stringa di query e la invia ai proxy proxy come Cookie JSESSIONID.
Tutto funziona perfettamente per gli URL che sono protetti da base di autenticazione. Ma poi quando l'utente chiama il terzo url (che è pubblicamente disponibile), Apache non esegue correttamente il bilanciamento del carico.
Per esempio, quando io chiamo servizio 1 o 2, ottengo i seguenti log di 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
Che è perfettamente bene, come la richiesta è destinata a bersaglio tomcat2.
Ma poi quando chiamo service3, ottengo:
[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
Come si può vedere, anche se il cookie JSESSIONID è lo stesso, Apache invia la richiesta al Tomcat sbagliato (qui tomcat1).
Potrebbe essere il fatto che l'URL per service3 non richiede l'autenticazione di base Auth, dove service1 e service2 fanno?
Sono sicuro che ho fatto qualcosa di sbagliato, ma mi sono guardato intorno da molto tempo e non riesco a farlo funzionare.
Il vostro aiuto è molto apprezzato.
Grazie
Questo è vero, sull'esempio ho fornito ho dimenticato il jvmRoute. Ma nemmeno impostarlo su server.xml non ha risolto il problema. –
Prova a pubblicare i tuoi xmls del server –