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
|