In questo post vedremo come poter integrare l'Application Server Apache Tomcat su di un server HTTP Apache, in questo modo potremo aggiungere la capacità di eseguire Servlet o pagine jsp ad un Server Web Apache già installato e funzionante.Il motivo che ci può condurre a questa scelta sono essenzialmente due:per maggior flessibilità, possiamo far girare Apache HTTP Server su di una macchina e Apache Tomcat su di un'altra, aggiungendo anche maggior sicurezza ad esempio posizionando il server su cui gira Tomcat dietro ad un firewall accessibile solo da Apche HTTP Server; per maggior stabilità, Apache HTTP è notoriamente più stabile e veloce di Tomcat ed inoltre un eventuale crash di Tomcat renderebbe solo le jsp e le Servelt non raggiungibili.
In questo post vedremo come poter integrare l’Application Server Apache Tomcat su di un server HTTP Apache, in questo modo potremo aggiungere la capacità di eseguire Servlet o pagine jsp ad un Server Web Apache già installato e funzionante.
Il motivo che ci può condurre a questa scelta sono essenzialmente due:
- per maggior flessibilità, possiamo far girare Apache HTTP Server su di una macchina e Apache Tomcat su di un’altra, aggiungendo anche maggior sicurezza ad esempio posizionando il server su cui gira Tomcat dietro ad un firewall accessibile solo da Apche HTTP Server;
- per maggior stabilità, Apache HTTP è notoriamente più stabile e veloce di Tomcat ed inoltre un eventuale crash di Tomcat renderebbe solo le jsp e le Servelt non raggiungibili.
Per poter perseguire i nostri scopi illustreremo due metodi possibili:
- utilizzando un Reverse Proxy (più lento ma semplice da configurare);
- utilizzando il connettore jk (più efficiente ma leggermente più laborioso da configurare).
Iniziamo col vedere come impostare un proxy di tipo reverse verso Tomcat, bisogna scegliere quale protocollo utilizzare: HTTP o AJP; AJP offre migliori performance in quanto è un protocollo binario al contrario di HTTP che è un formato testuale (http://wiki.apache.org/tomcat/FAQ/Connectors#Q2), HTTP potrebbe però essere l’unica scelta se i due Server (Apache e Tomcat) comunicano attraverso un Firewall per questioni di sicurezza come abbiamo spiegato in precedenza. Detto ciò forniremo un esempio per ognuno dei due casi. Un altro limite di AJP è che il formato dei pacchetti scambiati non può superare la dimensione di 8 KB.
Supponiamo di voler usare un proxy di tipo http, bisogna innanzitutto caricare i moduli mod_proxy.so e mod_proxy_http.so che sono già inclusi nella cartella modules di Apache:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
poi dobbiamo inserire questa direttiva all’interno del file http.conf di Apache:
<Location "/esempi/"> ProxyPass http://localhost:8080/examples/ ProxyPassReverse http://localhost:8080/examples/ </Location>
nel nostro esempio sia Apche che Tomcat si trovano sulla stessa macchina (di conseguenza possiamo usare localhost invece dell’ip della macchina) e Tomcat è in ascolto sulla porta 8080 (la porta di default), mentre supponiamo che Apache giri su porta 80. La porzione di url /esempi/ contenuta in Location indica che le nostre richieste per l’url http://localhost/esempi/ vengano girate al context path examples che si trova nella cartella webapps (cartella di deploy di default di Tomcat) .
Se vogliamo usare il protocollo AJP dobbiamo includere questi moduli:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
e cambiare la direttiva in questo modo:
<Location "/esempi/">
ProxyPass ajp://localhost:8009/examples/
</Location>
le modalità di redirecting restano le stesse.
Vediamo ora come usare il connettore mod_jk, che è l’evoluzione recente del precedente mod_jserv. I vantaggi rispetto ai moduli proxy sono una migliorata gestione del load balancing, del controllo degli errori ed un supporto per pacchetti AJP più grandi di 8 KB, di contro il modulo non è integrato nella distribuzione di Apache HTTP Server e potrebbe essere necessario effettuarne il build (compilazione) per uno specifico S.O. se esso non è disponibile.
Dunque per provare questo modulo bisogna scaricarlo dal sito Apache, lo facciamo andando a questa url e scegliendo quello giusto per il nostro Sistema Operativo:
http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/
la versione che uso in questo articolo è la 1.2.31 del Novembre 2010 (versione Windows a 32 bit).
Scaricato il modulo lo rinominiamo mod_jk.so e lo posizioniamo nella cartella modules, a questo punto possiamo includerlo nel nostro file httpd.conf in questo modo:
LoadModule jk_module modules/mod_jk.so
inseriamo poi questa direttiva
<IfModule jk_module> # Path di workers.properties # è consigliabile inserire workers.properties nella stessa cartella di httpd.conf JkWorkersFile conf/workers.properties # Path dei log di jk # è consigliabile inserire mod_jk.log nella stessa cartella di access_log JkLogFile logs/mod_jk.log # Settiamo il livello del log di jk [debug/error/info] JkLogLevel info # Settiamo il formato del log JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " # JkOptions indicano di inviare la SSL KEY SIZE, JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories # JkRequestLogFormat setta il formato della richiesta JkRequestLogFormat "%w %V %T" # Invia tutto per il context /examples al worker dal nome worker1 (ajp13) JkMount /esempi/* worker1 </IfModule>
Abbiamo indicato il path del file workers.properties e del file di log, inoltre abbiamo specificato delle opzioni del modulo JK, in particolare con JKMount abbiamo specificato che alla richiesta dell’url /esempi/ questa venga girata da Apache a Tomcat.
Dobbiamo ora creare un file worker.properties e lo posizioniamo nella cartella /conf di Apache:
# Definiamo un worker che usi ajp13 worker.list=worker1 # Settiamo le proprietà per il worker1 (ajp13) worker.worker1.type=ajp13 worker.worker1.host=localhost worker.worker1.port=8009 worker.worker1.lbfactor=50 worker.worker1.cachesize=10 worker.worker1.cache_timeout=600 worker.worker1.socket_keepalive=1 worker.worker1.socket_timeout=300
alcune di queste proprietà sono deprecate e quindi possiamo anche eliminarle (cachesize e cache_timeout). Un worker Tomcat è una istanza di Tomcat che è in attesa per eseguire una Servlet o una pagina JSP, per cui abbiamo Apache HTTP Server che invia tramite forward una Servlet o una JSP ad un processo Tomcat (il worker dunque). Tramite il file di properties abbiamo specificato alcune proprietà del worker (lo abbiamo chiamato worker1), possiamo definirne degli altri semplicemente aggiungendo una lista separata da virgole dopo la entry worker.list (ad esempio worker.list= worker1, worker2, etc…). La proprietà type è l’unica obbligatoria e definisce il protocollo utilizzato (AJP versione 1.3) mentre host sarà l’indirizzo di Tomcat (nel nostro caso gira sulla stessa macchina di Apache) e port 8009 è la porta di default del protocollo AJP13.
La lista completa di proprietà è a questo indirizzo: http://tomcat.apache.org/connectors-doc/reference/workers.html.
COMMENTS