Apache + Tomcat – Problemi con le sessioni e il bilanciamento del carico

Mi trovo di fronte alcuni problemi con Apache mod_proxy_balancer per quanto riguarda sessioni permanenti.

Abbiamo sviluppato un soggiorno webservice in Java in esecuzione su Tomcat. L’attuale backend utilizza Acegi di sicurezza, con Autenticazione l’autenticazione di Base.

L’architettura è (scusate sono un nuovo utente, non riesco a postare le immagini) :

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

Abbiamo questo “Java Reverse Proxy” per lo svolgimento di attività varie cose. Lo fa anche il Basic Auth autenticazione su Tomcat (Tomcat1, Tomcat2).

L’utente finale chiamate url del tipo : http:///a/b?username=foo&password=bar&sessione=xxx

Il reverse proxy, quindi inoltra la richiesta di Apache, inviando lungo le credenziali di Autenticazione Base di gettoni.

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 attraverso 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

In prima convocazione per service1, quindi JSESSIONID viene restituito all’utente, e quindi invia le informazioni di tale sessione come parte della richiesta (nella stringa di query, il parametro di sessione)

Per mantenere le sessioni di stati nel backend gattoni (tomcat1, tomcat2), java reverse proxy ottiene la sessione dalla stringa di query e la invia al proxy gattoni come JSESSIONID cookie.

Tutto funziona perfettamente bene per gli URL che sono auth di base protetta. Ma poi, quando l’utente chiama il terzo url (che è di dominio pubblico), Apache non eseguire il bilanciamento del carico correttamente.

Per esempio, quando chiamo il servizio 1 o 2, ottengo il seguente 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, la richiesta è destinata a destinazione tomcat2.

Ma poi quando ho chiamata 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 JSESSIONID cookie è lo stesso, Apache invia la richiesta di sbagliato tomcat (qui tomcat1).

Potrebbe essere il fatto che la url per service3 non richiede Autenticazione l’autenticazione di Base, mentre service1 e service2 fare ?

Io sono abbastanza sicuro che ho fatto qualcosa di sbagliato, ma ho cercato in giro per un lungo tempo, e io non riesco a farlo funzionare.

Il vostro aiuto è molto apprezzato.

Grazie

InformationsquelleAutor benjamin.d | 2012-02-22



3 Replies
  1. 6

    Non vedo un jvmRoute suffisso sul tuo JSESSIONID. mod_proxy utilizza jvmRoute di instradare correttamente la appiccicoso le sessioni istanze di Tomcat. jvmRoute è dichiarato nell’tomcat di configurazione del server (dove ogni istanza del server ha il suo unico jvmRoute identificatore.

    • È vero, l’esempio che ho fornito, ho dimenticato il jvmRoute. Ma anche in server.xml non ha risolto il problema.
    • Prova a postare il tuo server xmls
  2. 1

    Stavo affrontando lo stesso problema e risolto modificando la riga sottostante –

    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>

    Si prega di notare che la configurazione scolonpathdelim=On
    Di riferimento – http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html

  3. 0

    Forse tis sarà di aiuto. Questa è la mia config su un server 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>

    Config in server.xml di tomcat Server 1:

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"}">

Lascia un commento