MokaByte 59 - Gennaio 2002 
Integrare Tomcat con IIS
di
Fabio Possieri
In alcuni casi può presentarsi la necessità di dover utilizzare contemporaneamente un Web Server e un Application Server di differenti case produttrici. Tomcat, il Servlet Container ufficiale di riferimento per la tecnologia Java Servlet e JSP, viene associato "naturalmente" ad Apache ma è possibile farlo cooperare con altri Web Servers. In questo articolo si vedrà come integrare Tomcat con IIS in modo da reindirizzare le richieste di Servlets e JSP verso Tomcat, farle processare da quest'ultimo e spedire indietro i risultati ad IIS

Far cooperare Tomcat e IIS: guida all'integrazione dei due sistemi
Normalmente IIS non è in grado di gestire Servlets e Java Server Pages. Tuttavia, lo si può configurare in modo da fargli utilizzare un componente, il "redirector plug-in" (scaricabile dal web site del progetto Jakarta). In questo modo IIS funzionerà normalmente eccetto quando arriveranno delle richieste di Servlets e/o JSP: queste saranno re-dirette verso un processo di Tomcat, detto "worker", che si occuperà della loro gestione. Nei paragrafi seguenti verranno definite le convenzioni adottate nel corso dell'articolo, sarà fornita una breve descrizione di redirector e workers e verranno mostrati, in dettaglio, i passi da compiere per ottenere un'integrazione fra i due sistemi. Infine saranno presentate, attraverso esempi, le procedure per inserire una nuova Web Application all'interno dell'ambiente integrato, per portare IIS e Tomcat su due macchine separate e per installare Tomcat come NT service.

 

 

Indicazioni generali e convenzioni adottate
La procedura di integrazione è stata provata su Windows 2000 con IIS 5.0, Tomcat 3.3 ed il Java SDK 1.3.1_01. Per altre versioni di Tomcat potrebbero essere necessarie delle operazioni leggermente differenti.
Nel corso dell'articolo il Java SDK, Tomcat ed IIS si supporranno già installati nelle seguenti directory:

Java SDK: C:\jdk
Tomcat : C:\Tomcat
IIS root: C:\InetPub\wwwroot

Inoltre si considereranno già impostate le seguenti variabili di sistema:

JAVA_HOME = C:\jdk
TOMCAT_HOME = C:\Tomcat

N.B.: è opportuno assicurarsi della presenza, come prima directory nella variabile d'ambiente "PATH", del seguente percorso:

%JAVA_HOME%\bin

Questa accortezza è dettata dal fatto che alcuni applicativi possono inserirvi davanti l'indicazione di una propria Java Run-Time directory, rovinando l'installazione corrente di Tomcat.
Inoltre, prima di iniziare la procedura di configurazione è conveniente assicurarsi che Tomcat stia funzionando regolarmente, aprendo con il browser l'indirizzo http://localhost:8080 .

 

ISAPI redirector e Tomcat workers
Il redirector è un plug-in ISAPI per IIS costituito da due componenti: il "filter" e la "extension".
IIS carica il redirector plug-in e ne chiama la funzione filter per ogni richiesta in arrivo. Questo confronta l'URL della richiesta con una lista di identificatori di risorse (URI-paths) contenuta nel file uriworkermap.properties; se la richiesta corrente è associabile ad uno degli elementi della lista di URI-paths, il filter trasferisce tale richiesta all'extension. L'extension recupera i parametri della richiesta e li invia al worker appropriato, usando il protocollo ad esso associato; quando riceve la risposta dal worker, la spedisce al browser.
Un worker è un istanza di Tomcat in attesa di eseguire Servlets a favore di un dato Web Server. Ad esempio, in questo articolo si vuole ottenere una configurazione nella quale IIS inoltra le richieste di Servlets ad un processo di Tomcat (il worker) in attesa al "livello" superiore.
I Tomcat-workers sono definiti in un file di proprietà chiamato workers.properties. Quando viene attivato, il redirector plug-in cerca nella proprietà "worker.list" i nomi dei workers da istanziare; questi sono anche i processi verso i quali si possono "mappare" delle richieste. Il nome di un worker non deve contenere spazi ed un buon criterio per assegnare nomi ai workers è quello di seguire le Java variable naming rules.
In workers.properties sono già definiti alcuni workers che lavorano in modalità "out-of-process" (quali ajp12 ed ajp13), uno che lavora in modalità "in-process" (jni worker) ed un altro per il load balancing (lb). Ad esempio, il worker jni apre una JVM all'interno del processo del Web Server e vi esegue sopra Tomcat - da cui la dicitura "in-process".
In questo articolo verrà utilizzato il worker predefinito di tipo ajp12, in grado di inoltrare richieste ad altri out-of-process workers sfruttando il protocollo ajpv12 (costruito sopra TCP/IP).

 

 

Configurare il redirector plug-in
Per installare il redirector plug-in occorre avere a disposizione il file isapi_redirect.dll (ad esempio, nella directory C:\Tomcat\bin). Tomcat è in grado di generare una versione base dei file di configurazione necessari; a tale scopo si può aprire il Command Prompt, andare nella directory C:\Tomcat\bin e digitare:

tomcat run -jkconf

A questo punto, nella cartella C:\Tomcat\conf\auto, dovrebbe essere comparso il file di registro iis_redirect.reg: importare le informazioni nel System Registry facendo doppio-click sull'icona del file (Figura 1). Si deve quindi modificare il file workers.properties, contenuto nel percorso C:\Tomcat\conf\jk, impostando le proprietà "java_home" e "tomcat_home" con i percorsi C:\jdk e C:\Tomcat .


Figura 1 - Informazioni aggiunte nel Registry dal file iis_redirect.reg

Così configurato, il redirector plug-in è in grado di colloquiare con Tomcat; adesso occorre farlo "parlare" anche con IIS. A questo scopo, aprire la console di IIS e creare, all'interno del "Sito Web predefinito", una nuova directory virtuale di nome jakarta, impostandone il percorso fisico su C:\Tomcat\bin - dove è contenuto il plug-in - ed assegnandole il permesso di "esecuzione script ed eseguibili".
Ora è il momento di inserire il plug-in in IIS. Dalla console di IIS selezionare il nome della macchina (e non il Sito Web predefinito) ed aprire il menù "azioni --> proprietà", quindi premere il pulsante "Modifica…" delle "Proprietà master". Nella nuova finestra apertasi, andare su "Filtri ISAPI" e premere il pulsante "Aggiungi…"; qui è possibile creare un nuovo filtro di nome jakarta ed assegnargli come eseguibile il file "C:\Tomcat\bin\isapi_redirect.dll".
Nell'elenco dei filtri, accanto a jakarta dovrebbe essere comparsa una freccia rossa (e/o la scritta *sconosciuto*). Dalla console di IIS premere il tasto destro del mouse sopra il nome della macchina e selezionare "riavvia IIS"; a seguito di questa operazione la freccia dovrebbe essere diventata verde, ad indicare che il plug-in è attivo.
Una volta avviato Tomcat, è possibile testare il funzionamento del redirector plug-in aprendo con il browser l'indirizzo http://<URL-server>/examples/jsp/ e provando i vari esempi presenti.

 

 

Aggiungere una nuova Web Application
Adesso che Tomcat e IIS sono stati integrati, è il momento di inserire all'interno del sistema le proprie applicazioni Web realizzate con tecnologia Java. A questo scopo, in Tomcat è presente una cartella predefinita chiamata "webapps" e destinata a contenere le varie Web Applications. Una volta sistemata la propria applicazione in webapps, bisogna dire al Servlet Container dove trovare le Servlets e le JSP (tramite delle estensioni del file server.xml) ed indicare al filtro ISAPI quali richieste devono essere re-dirette verso Tomcat (tramite il file uriworkermap.properties).
Supponendo che la Web Application si chiami "MyWebApp" è possibile creare nella directory C:\Tomcat\conf un documento XML chiamato apps-MyWebApp.xml. Questo file è un'estensione di server.xml e permette di specificare le proprietà particolari della singola applicazione quali, ad esempio, la directory di base dell'applicazione e quella dei files di log. Nel pezzo di codice XML seguente vengono impostati l'URL relativo attraverso il quale l'applicazione può essere visitata via web (path), il percorso di base dei suoi files (docBase) e le informazioni su alcuni log-files:

<?xml version="1.0" encoding="ISO-8859-1"?>
<webapps>
<Context path="/MyWebApp"
docBase="webapps/MyWebApp"
debug="0"
reloadable="true">
<LogSetter name="MyWebApp.log" path="logs/MyWebApp.log"/>
<LogSetter name="MyWebApp_servlet_log"
path="logs/MyWebApp_servlet.log"
servletLogger="true"/>
</Context>
</webapps>

Per indicare al filtro ISAPI quali pagine verranno servite da Tomcat, è sufficiente inserire nella lista di URI-paths precedentemente menzionata (contenuta nel file uriworkermap.properties) una coppia di entrate, relative a MyWebApp, del tipo:

/MyWebApp=$(default.worker)
/MyWebApp/*=$(default.worker)

dove "default.worker" è associato al worker ajp12 preso in considerazione in questo articolo.
Effettivamente, questa lista è molto generica. Si può essere più espliciti e far re-dirigere verso Tomcat solamente le pagine JSP e le Servlets, sostituendo la lista precedente con:

/MyWebApp/*.jsp=$(default.worker)
/MyWebApp/servlet/*=$(default.worker)

E, addirittura, scegliere quale worker deve gestire una data Servlet, tramite:

/MyWebApp/servlet/MyServlet1=ajp12
/MyWebApp/servlet/MyServlet2=ajp13

N.B.: Ogni modifica al file uriworkermap.properties comporta il riavvio di IIS, mentre aggiunte o cambiamenti nei files apps-MyAppName.xml o in server.xml sono validi solo dopo il riavvio di Tomcat.

 

 

Tomcat e IIS su macchine separate
Finora abbiamo mantenuto Tomcat e Information Server sulla stessa macchina; tuttavia, vi sono delle situazioni nelle quali è richiesta una separazione "fisica" fra Web Server ed Application Server. In questi casi si può notare come i files iis_redirect.reg, isapi_redirect.dll, workers.properties e uriworkermap.properties siano utilizzati da IIS allo scopo di inoltrare le richieste verso il particolare worker in grado di soddisfarle.
Si prendano in considerazione due macchine: una, detta "server-A", sulla quale è installato IIS e l'altra, "server-B", dove è installato Tomcat. Una possibile soluzione al problema consiste nel portare i files sopra citati su "server-A" (ad esempio, nella directory C:\Redirect) prima di installare il redirector plug-in. A questo punto occorre editare il file worker.properties, indicando gli indirizzi IP delle macchine sulle quali sono in attesa di "lavorare" i vari workers. Nel caso qui trattato, per il worker ajp12 si avrà:

worker.ajp12.port=8007
worker.ajp12.host=<indirizzo IP di server-B>
worker.ajp12.type=ajp12

Infine, durante l'installazione del plug-in si dovrà tener presente il fatto che, questa volta, il filtro ISAPI è contenuto nella directory C:\Redirect; ciò comporterà l'esecuzione di opportune modifiche ai vari files sopra citati (ad esempio, nel file iis_redirect.reg vanno cambiati i percorsi da importare nel Registry relativi a workers.properties e uriworkermap.properties).
Una volta riavviato IIS, su "server-A" si può fare un test aprendo con il browser l'indirizzo http://<URL-server-A>/examples/jsp; provando uno qualsiasi degli esempi presenti si dovrebbe notare l'intercettazione della richiesta nella console di Tomcat - su "server-B".
Per una configurazione più specifica dei workers è possibile consultare la documentazione in [4].

 

 

Ultimo atto: installare Tomcat come NT service
Una volta integrati i due server, è possibile fare un passo in più ed installare Tomcat come NT service, in modo che parta automaticamente all'accensione della macchina. Fra i tanti applicativi disponibili a questo scopo, il più usato - e trattato in questo articolo - sembra essere il Jakarta NT Service; per configurarlo sono necessari due files: wrapper.properties e jk_nt_service.exe (ad esempio, nella directory C:\Tomcat\conf\jk dove è già contenuto wrapper.properties).
Come prima operazione, va editato wrapper.properties inserendo i seguenti valori (convenuti all'inizio dell'articolo):

wrapper.tomcat_home=C:\Tomcat
wrapper.java_home=C:\jdk

Quindi, dal Command Prompt ci si deve portare nella directory C:\Tomcat\conf\jk e digitare i seguenti comandi:

jk_nt_service -i tomcat -a wrapper.properties
jk_nt_service -s tomcat

Il primo comando installa (-i) Tomcat come servizio di nome "tomcat", basandosi sul file di proprietà wrapper.properties; il secondo avvia (-s) il servizio appena creato (Figura 2).
Per rimuovere un servizio Tomcat, di nome "tomcat", precedentemente installato basta andare nella stessa directory e digitare:

jk_nt_service -r tomcat

Per una configurazione più specifica è possibile consultare la documentazione in [5].

Figura 2 - Installazione di Tomcat come NT service

N.B.: Esiste un bug, documentato in [6], riguardante l'uso di Tomcat come servizio in combinazione con il Java SDK 1.3. Il bug provoca l'arresto del servizio appena l'utente si disconnette dal sistema. Spulciando fra i vari newsgroup ho trovato un sistema, funzionante nel mio caso, in grado di aggirare questo problema. La soluzione sta nel ridurre l'uso di segnali del S.O. da parte della JVM per mezzo dell'opzione "non-standard" -Xrs presente nel Java SDK 1.3.1_01. Essendo non-standard, non è garantita la sua presenza in altre versioni di Java; ad esempio, tale opzione è assente nel Java SDK 1.3.0.
Nel file wrapper.properties si può quindi aggiungere l'opzione -Xrs come segue:

wrapper.cmd_line=$(wrapper.javabin) -Xrs -D.....

ed il problema non si dovrebbe più ripresentare.

 

 

Conclusioni
In questo articolo si è visto come integrare Tomcat con IIS per mezzo di un redirector plug-in realizzato per Tomcat e sfruttato da Information Server al fine di re-dirigere le richieste di Servlets e JSP verso il Servlet Container, tramite un worker operante in modalità "out-of-process".
Sono stati quindi affrontati i problemi derivanti dalla necessità di avere Tomcat installato su una macchina diversa da quella sulla quale gira IIS e/o di averlo come NT service, operazioni senza le quali il lavoro di integrazione precedente sarebbe risultato pressoché inutile in molti casi reali.
Il senso di questo articolo può essere vario. Esiste una tendenza odierna delle aziende verso il "mondo" Java, nell'ottica della quale queste azioni possono essere viste come un primo passo della migrazione verso la tecnologia Java. D'altro canto, Java e ASP sono due tecnologie diverse con differenti caratteristiche per cui potrebbe risultare utile, in alcuni casi, un loro uso combinato.

I files descritti in questo articolo si possono recuperare ai seguenti URL:
http://java.sun.com/j2se/1.3/download-windows.html
http://jakarta.apache.org/builds/jakarta-tomcat/release/v3.3/bin/jakarta-tomcat-3.3.zip
http://jakarta.apache.org/builds/jakarta-tomcat/release/v3.3/bin/win32/i386/isapi_redirect.dll
http://jakarta.apache.org/builds/jakarta-tomcat/release/v3.3/bin/win32/i386/jk_nt_service.exe

 

 

Bibliografia
[1] Andrew Bruno - "Tomcat 4.0.1 on Windows 2000 with IIS and NT Service", ottobre 2001, http://www.mycgiserver.com/~vacodi/howto/tomcat/iisnt/index.html
[2] "Integrating Tomcat With IIS", http://www.geocities.com/beforewisdom/Java/Archive/Tomcat/tomcatAndIIS.html
[3] Gal Shachor - "Tomcat IIS HowTo", http://jakarta.apache.org/tomcat/tomcat-3.2-doc/tomcat-iis-howto.html
[4] Gal Shachor - "Tomcat workers.properties", http://jakarta.apache.org/tomcat/tomcat-3.3-doc/Tomcat-Workers-HowTo.html
[5] Gal Shachor - "Working with the Jakarta NT Service", http://jakarta.apache.org/tomcat/tomcat-3.3-doc/NT-Service-howto.html
[6] AA.VV. - "Any Windows NT Service embedding Java VM aborts, when user logs out from Windows", marzo 2000, http://developer.java.sun.com/developer/bugParade/bugs/4323062.html


Fabio Possieri è laureato in Ingegneria Informatica, indirizzo Sistemi ed Applicazioni Informatici, presso l'Università degli Studi di Pisa. Attualmente si occupa della progettazione di architetture e sistemi Web-oriented in tecnologia Java. Può essere contattato, tramite e-mail, all'indirizzo f.possieri@tiscali.it


MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems; tutti i diritti riservati 
E' vietata la riproduzione anche parziale 
Per comunicazioni inviare una mail a info@mokabyte.it