Realizzare una configurazione di bilanciamento del carico per Tomcat, utilizzando Apache come server web e il modulo proxy, è un processo relativamente semplice, soprattutto se si segue un approccio metodico.
In questa guida, vi illustrerò passo dopo passo come configurare Apache con Tomcat, implementando un bilanciatore di carico tramite Mod Proxy.
Il bilanciamento del carico è fondamentale in ambienti di produzione per garantire una maggiore affidabilità e disponibilità del servizio.
Configurazione del Server Web Apache
Per iniziare, è necessario abilitare i moduli proxy_module
, proxy_balancer_module
e proxy_http_module
nel file di configurazione httpd.conf
del server web Apache.
Assicurarsi che le seguenti direttive siano presenti e attivate:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_http_module modules/mod_proxy_http.so
Successivamente, è necessario aggiungere la direttiva ProxyPass
, specificando il nome del bilanciatore per la radice del contesto dell’applicazione. In questo esempio, useremo /examples
come percorso proxy e mycluster
come nome del bilanciatore.
È fondamentale includere l’opzione stickysession
. La sua assenza porterebbe a una distribuzione casuale delle richieste tra i server Tomcat, causando potenziali problemi di sessione.
<IfModule proxy_module> ProxyRequests Off ProxyPass /examples balancer://mycluster stickysession=JSESSIONID ProxyPassReverse /examples balancer://mycluster stickysession=JSESSIONID <Proxy balancer://mycluster> BalancerMember https://localhost:8080/examples route=server1 BalancerMember https://localhost:8090/examples route=server2 </Proxy> </IfModule>
Come si può notare nella configurazione precedente, ho incluso il parametro route
nell’attributo BalancerMember
in modo tale che il valore del percorso possa essere aggiunto all’ID di sessione.
Ora configuriamo Apache per registrare l’ID di sessione JSESSIONID nei log di accesso.
- Per fare ciò, è necessario aggiungere la seguente stringa alla direttiva
LogFormat
:
%{JSESSIONID}C
Ad esempio:
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i""%{JSESSIONID}C"" combined
- Una volta apportate queste modifiche, riavviare il server web Apache.
Configurazione di Tomcat
Passiamo ora alla configurazione delle istanze Tomcat. È fondamentale assegnare a ciascuna istanza lo stesso ID di route definito in BalancerMember
precedentemente.
- Questo si ottiene aggiungendo il parametro
jvmRoute
nel fileserver.xml
di Tomcat, all’interno del tag dell’elemento motore.
Ecco un esempio per l’istanza Tomcat in ascolto sulla porta 8080:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="server1">
E qui per l’istanza in ascolto sulla porta 8090:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="server2">
Verifica della Configurazione
Per verificare il corretto funzionamento della configurazione, è necessario generare un carico sull’applicazione e monitorare i log di accesso del server Apache. Questo permetterà di assicurarsi che le richieste vengano indirizzate a una sola istanza Tomcat.
Osservando i log, noterete che l’ID di sessione è stato aggiunto al percorso, come nell’esempio seguente:
127.0.0.1 - - [18/Sep/2013:10:02:02 +0800] "POST /examples/servlets/servlet/RequestParamExample HTTP/1.1" 200 662 "https://localhost/examples/servlets/servlet/RequestParamExample" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2" 127.0.0.1 - - [18/Sep/2013:10:02:06 +0800] "GET /examples/servlets/servlet/RequestInfoExample HTTP/1.1" 200 693 "https://localhost/examples/servlets/" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2" 127.0.0.1 - - [18/Sep/2013:10:02:17 +0800] "GET /examples/servlets/reqinfo.html HTTP/1.1" 200 3607 "https://localhost/examples/servlets/" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2" 127.0.0.1 - - [18/Sep/2013:10:02:20 +0800] "GET /examples/servlets/servlet/SessionExample HTTP/1.1" 200 1124 "https://localhost/examples/servlets/" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2" 127.0.0.1 - - [18/Sep/2013:10:02:26 +0800] "POST /examples/servlets/servlet/SessionExample HTTP/1.1" 200 1142 "https://localhost/examples/servlets/servlet/SessionExample" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2" 127.0.0.1 - - [18/Sep/2013:10:02:28 +0800] "GET /examples/servlets/servlet/SessionExample?dataname=fda&datavalue=fadaf HTTP/1.1" 200 1159 "https://localhost/examples/servlets/servlet/SessionExample" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B4EC1D73CF8C7482B7D46.server2" 127.0.0.1 - - [18/Sep/2013:10:02:32 +0800] "GET /examples/servlets/servlet/SessionExample?dataname=foo&datavalue=bar HTTP/1.1" 200 1174 "https://localhost/examples/servlets/servlet/SessionExample?dataname=fda&datavalue=fadaf" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2" 127.0.0.1 - - [18/Sep/2013:10:02:36 +0800] "GET /examples/servlets/servlet/RequestHeaderExample HTTP/1.1" 200 1423 "https://localhost/examples/servlets/" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2"
Spero che questa guida vi sia stata d’aiuto per configurare il bilanciatore di carico per Tomcat, utilizzando Apache Mod Proxy e sessioni persistenti.
Se siete interessati ad approfondire l’amministrazione di Tomcat, vi suggerisco questo corso online.
Ti è piaciuto questo articolo? Condividilo!