Zusammenfassung:Web-Anwendungen sollten 7x24h zur Verfügung stehen, denn nichts ist schlimmer, wenn der Service nicht erreichbar ist oder eine undefinierte Meldung dem Benutzer angeboten wird.
Sicher darf ein Service ausfallen, aber der Mensch merkt sich nur zu oft die unangenehmen Dinge, die positiven sind eine Selbstverständlichkeit.
Sehr oft wird der Apache HTTP Server vor einem oder mehreren Tomcat Servern vorgeschaltet:
- statische Inhalte werden vom Apache HTTP Server schneller ausgeliefert und
- der Apache Webserver kann als Load Balancer die Http-Anfragen auf mehrere Tomcat Server verteilen.
Der Apache HTTP Webserver muss das mod_jk Modul laden, nun können Anfragen über das AJP 1.3 Protokoll an ein oder mehrere Tomcat Server weitergeleitet werden.
Die Tomcat Server haben einen AJP 1.3 Connector Port geöffnet. Das Apache mod_jk Modul kennt die Adressen der Tomcat Server aus der 'worker.properties' Datei.
In dieser Konfiguration wird davon ausgegangen, dass über den Port 443 des Apache HTTP Webserves die Request per Load Balancing an die jeweilige Tomcat Instance automatisch verteilt werden. Ebenso tauschen die Tomcats ihre Sessions per Session Replikation aus.

Für den praktischen Einsatz wurde der Tomcat 5.5.20 und den Apache HTTP Webserver in der Version 2.2.4 genommen.
Schritt 1:Tomcat apache-tomcat-5.5.20.zip herunterladen und z.B.: nach C:\Tomcat-5.5.20\Tomcat1 entpacken.
Schritt 2:Die Ordner conf, logs, shared, temp, webapps und work in den Ordner Tomcat2 kopieren.
Schritt 3:Jetzt wird der Tomcat1 als Windows Dienst registiert. Dafür müssen noch die Umgebungsvariablen CATALINA_BASE, CATALINA_HOME und JAVA_HOME unter System variables angelegt werden. Man kann natürlich die Variablen an einen Benutzer binden, um es einfach zu halten wurden die Variablen als Systemvariablen deklariert.

CATALINA_BASE: C:\Tomcat-5.5.20\Tomcat1
CATALINA_HOME: C:\Tomcat-5.5.20\Tomcat1

JAVA_HOME: C:\j2sdk1.4.2_17\bin
Jetzt fügen wir noch im Path den Wert %CATALINA_HOME%\bin hinzu.
Schritt 4:Auf der DOS-Konsole muss der Befehl service install Tomcat1 im Ordner C:\Tomcat-5.5.20\Tomcat1\bin eingeben werden. Der Dienst sollte zur Verfügung stehen.

Vorher muss der Dienst gestartet werden. Eine Überprüfung mit der URL: http://localhost:8080/ sollte das beweisen.
Schritt 5:Jetzt müssen wir noch den Tomcat2 als weiteren Dienst registieren. Dafür muss die server.xml im Ordner C:\Tomcat-5.5.20\Tomcat2\conf angepasst werden.
ALT: <Server port="8005" shutdown="SHUTDOWN">
NEU: <Server port="8015" shutdown="SHUTDOWN">
ALT: <Connector port="8080" maxHttpHeaderSize="8192"...
NEU: <Connector port="8090" maxHttpHeaderSize="8192"...
ALT: <Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
NEU: <Connector port="8019" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
Schritt 6:In den Systemvariablen den Wert für CATALINA_BASE ändern in C:\Tomcat-5.5.20\Tomcat2.

Jetzt muss ein neues DOS-Fenster geöffnet und im Ordner C:\Tomcat-5.5.20\Tomcat1\bin den Befehl service install Tomcat2 absetzen werden.
Schritt 7:Der Tomcat2 sollte nun als zweiter Windows-Dienst registiert sein.

Ob beide Dienste Tomcat 1 und 2 erfolgreich funktionieren ist wie folgt zu prüfen.
Tomcat 1 (Port 8080): http://localhost:8080/

Tomcat 2 (Port 8090): http://localhost:8090/
Schritt 8:Beide Dienste stehen nun über unterschiedliche Ports 8080 und 8090 zur Verfügung. Der letzte Test im Task Manager bestätigt, dass beide Prozesse laufen.
Schritt 9:Nun laden wir den Apache HTTP Server von der URL http://httpd.apache.org/download.cgi in der Version 2.2.4 runter.
Schritt 10:
Schritt 11:
Schritt 12:
Schritt 13:Die Installationsroutine des Apache wurde hier nicht mit aufgeführt, ich denke, dass man damit klar kommen sollte. Als Installationsordner wurde C:\Apache-2.2.4 gewählt. Anschließend kann der Dienst gestartet werden.

Im Browser http://localhost eingeben. Es sollte folgendes erscheinen. Damit haben wir nun einen Apache HTTP Webserver in der Version 2.2.4 installiert. Jedoch fehlt
noch die Anbindung zum Tomcat. Dazu wird das Modul mod_jk.so in der httpd.conf eingebunden. Weiteres dazu später.
Schritt 14:Nun stoppen wir den Dienst und geben der Datei mod_jk-1.2.26-httpd-2.2.4.so einen neuen Namen mod_jk.so und kopieren diese unter C:\Apache-2.2.4\modules.
Schritt 15:Jetzt wird die Konfigurationsdatei httpd.conf angepasst und folgende Zeile LoadModule jk_module modules/mod_jk.so hinzugefügt um das Module zu laden.
Schritt 16:Jetzt muss eine Datei workers.properties erstellt und im Ordner conf des Apache abgelegt werden.

Der Apache HTTP Server muss nun alle Requests der Clients an den Tomcat 1 und 2 weiterreichen, die Datei workers.properties sagt dem Apache, wo er diese zwei Instanzen finden kann.
Schritt 17:Nun wird wieder die http.conf angepasst, damit die workers.properties auch gefunden wird.
Am besten plaziert man die folgenden Einträge nach dem LoadModule Eintrag. Weiter legen wir fest, dass jsp-examples nur durch worker1
behandelt wird sowie tomcat-docs durch worker2. Bisher haben wir noch kein automatisches Load Balancing zwischen dem Apache und den Tomcat hergestellt.
# Path to workers.properties
JkWorkersFile c:/Apache-2.2.4/conf/workers.properties
# Path to jk logs
JkLogFile c:/Apache-2.2.4/logs/mod_jk.log
# Jk log level [debug/error/info]
JkLogLevel info
# Jk log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions for forwarding
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
JkMount /jsp-examples worker1
JkMount /jsp-examples/* worker1
JkMount /tomcat-docs worker2
JkMount /tomcat-docs/* worker2
Schritt 18:Der Apache HTTP Webserver kennt nun den Tomcat 1 und 2. Jedoch müssen wir in der server.xml des Tomcat 1 und 2 noch das Attribute jvmRoute richtig
setzen, damit der Apache auch worker1 und worker2 richtig zuordnen kann.
Tomcat 1: <Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1">
Tomcat 2: <Engine name="Catalina" defaultHost="localhost" jvmRoute="worker2">
Anschließend starten wir noch alle Dienste.
Schritt 19:In den index.html Seiten kann man im Tag title noch den Zusatz Tomcat 1 oder Tomcat 2 einfügen, damit man eine Unterscheidung hat.
Tomcat 1: http://localhost/jsp-examples/
Tomcat 2: http://localhost/tomcat-docs
Schritt 20:Wenn der Test aus Schritt 19 erfolgreich verlaufen ist, dann kommt nun die eigentliche Anpassung des Apache. Damit eine automatische
Delegation durch den Apache vorgenommen werden kann, ist erneut die workers.properties anzupassen.
#worker.list=worker1,worker2
worker.list=balancer
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
worker.worker2.port=8019
worker.worker2.host=localhost
worker.worker2.type=ajp13
worker.worker2.lbfactor=1
worker.balancer.type=lb
worker.balancer.balance_workers=worker1,worker2
worker.balancer.method=B
Schritt 21:Jetzt passen wir noch die httpd.conf an.
JkMount /jsp-examples balancer
JkMount /jsp-examples/* balancer
Hier entscheidet der Apache automatisch ob er Tomcat 1 oder 2 nehmen soll für die Anwendung jsp-examples. Über den Parameter lbfactor kann man
erreichen, welcher Tomcat mehr Requests verarbeiten soll.
Schritt 22:Bis jetzt haben wir nur Load Balancing eingerichtet, jedoch nicht den Tomcat 1 und 2 zu einem Cluster verbunden. Damit die Session Replikation funktioniert muss in der Datei C:\Tomcat-5.5.20\Tomcat1\conf\server.xml der Tag Cluster gelöscht und durch folgenden Eintrag ersetzt werden.
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="127.0.0.1"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
</Cluster>
Nun das ganze noch für den Tomcat 2 in der Datei C:\Tomcat-5.5.20\Tomcat2\conf\server.xml.
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="127.0.0.1"
tcpListenPort="4002"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
</Cluster>
Schritt 23:Anschließend startet man den Tomcat 1 und darauf den Tomcat 2.
In der Log-Datei des Tomcat 1 kann man überprüfen, ob der Cluster erfolgreich gestartet wurde und die Replication im Grunde zur Verfügung steht.
Ein richtiger Test kann erst durch eine Anwendung abgedeckt werden, die die Kriterien eines Clusters erfüllt, weitere Angaben dazu sind unter
folgender URI http://tomcat.apache.org/tomcat-5.5-doc/cluster-howto.html zu finden.
05.06.2008 08:41:52 org.apache.catalina.cluster.tcp.SimpleTcpCluster start
INFO: Cluster is about to start
05.06.2008 08:41:52 org.apache.catalina.cluster.tcp.SimpleTcpCluster createDefaultClusterListener
INFO: Add Default ClusterListener at cluster localhost
05.06.2008 08:41:52 org.apache.catalina.cluster.tcp.ReplicationTransmitter start
INFO: Start ClusterSender at cluster Catalina:type=Cluster,host=localhost with name Catalina:type=ClusterSender,host=localhost
05.06.2008 08:41:52 org.apache.catalina.cluster.mcast.McastService start
INFO: Sleeping for 2000 milliseconds to establish cluster membership
05.06.2008 08:41:52 org.apache.catalina.cluster.tcp.SimpleTcpCluster memberAdded
INFO: Replication member added:org.apache.catalina.cluster.mcast.McastMember[tcp://127.0.0.1:4002,catalina,127.0.0.1,4002, alive=39548]
05.06.2008 08:41:54 org.apache.catalina.cluster.mcast.McastService registerMBean
INFO: membership mbean registered (Catalina:type=ClusterMembership,host=localhost)