jsp-develop.de presents:

Apache 1.3 + Tomcat 4 mehrfach instanziiert

von el_gitano,  12.02.2003 18:11:34

Idee:
die in Tomcat4 implementierte Container-Engine vernünftig nutzen, und mehrere Tomcat-Instanzen (nicht Servlets) gleichzeitig nebeneinander laufen zu lassen. Ausserdem den Apache davorschalten mit ein paar virtual-Domains,
die die Requests durchreichen.

Unterschied zu Tomcat 3.3.x:
Man konnte damals
nur mehrere Servlets auf einem Tomcatserver laufen lassen - diese haben sich zwar nicht gestört, mussten aber bei Neustart des Tomcat-servers alle neu geladen werden (bzw. waren alle von der gleichen Engine abhängig).
Tomcat4 gibt die Möglichkeit mehrfach mit verschiedenen Einstellungen gestartet zu werden.
So kann man verschiedene Instanzen durch verschiedene User administrierbar machen - was entscheidende Vorteile bei der Entwicklung verschiedener Applikationen auf
einem einzigen Server bringt.

Wie richte ich mehrere verschiedene Instanzen ein?!
Recht gut erklärt wird das auf dieser Seite:
http://www.mitlinx.de/webservices/howto_mehrere_tomcat_instanzen_betreiben.htm

Liest man sich die oben genannte Page gut durch
und verfährt mit seinen Applikationen genau wie es beschrieben ist,
ist man schon recht weit!

Es treten allerdings ganz heftige Probleme auf,
wenn man den Warp- (ist vorerst sowieso abzuraten) oder den Ajp13-Connector nicht richtig konfiguriert.
Wichtig ist, JEDER Instanz VERSCHIEDENE Connector-Ports zuzuweisen!
Sonst kommt man aus den "BindSocket"-Fehlern nicht mehr raus...

Da wir das ganze ja auchnoch hinter einen Apache hängen wollen und mit virtual-Domains ansprechen,
werden wir jeder Instanz einen eigenen Host-Namen zuweisen.
Die entsprechenden Stellen in den server.xml der
einzelnen Instanzen sehen dann also so aus:

# Connectoren
    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector className="org.apache.ajp.tomcat4.Ajp13Connector"
              port="9001" minProcessors="5" maxProcessors="75"
              acceptCount="10" debug="0"/>

# der AJP 1.3 Connector ist ursprünglich auf Port 8009.
# Für diese Instanz wählen wir aber einen anderen - etwa die 9001.
# Dieser Port darf aber von keinem anderen Programm verwendet werden.
# Bei einer weiteren Instanz wählen wir den Port 9002, dann 9003 usw...
# Alles andere lassen wir unangetastet.

# Virtual Domains
      <Host name="test1.halleluja.net" debug="0" appBase="webapps" unpackWARs="true">

# in der Zeile der Host-definition ändern wir lediglich den Wert von "name" von "localhost" auf die
# virtuelle Domain, die wir später verwenden möchten, in diesem Fall "test1.halleluja.net".
# eine weitere Instanz würde dann zum beispiel als "test2.halleluja.net" angesprochen... usw...

# den AJP-Listener einschalten
        <Listener className="org.apache.ajp.tomcat4.config.ApacheConfig" append="true" />

# diese Zeile fügt ihr einfach unter die oben dargestellte "Host"-Zeile ein.
# sie sichert, dass die Instanz auf Aufrufe über den AJP-Connector reagiert.


so, das schwierigste wäre geschafft...

jetzt braucht man noch die Verbindung
zwischen Apache und Tomcat - die mod_jk
(die würde ich jetzt mal empfehlen, aber es gibt da noch ein paar mehr!)
hier die für dein System beste runterladen:
http://jakarta.apache.org/builds/jakarta-tomcat-connectors/jk/release/

und diese dann in einen gut zu merkenden Pfad ablegen...
(ich hab sie z.B. im $TOMCAT_HOME/mod_jk/ abgelegt, da finde ich sie garantiert immer wieder - eigendlich gehört sie aber ins libexec/ von Apache)

Im gleich Verzeichnis (nur der Ordnung wegen) erstellen wir jetzt noch eine "workers.properties" - Datei.
Also:
Datei workers.properties anlegen mit folgendem Inhalt:

workers.tomcat_home=/usr/local/... # Euer $TOMCAT_HOME
workers.java_home=$JAVA_HOME # dürfte klar sein
worker.list=ajp13_1, ajp13_2 # für jede Instanz eine eigene Bezeichnung!

# so, und jetzt wiederholen wir den folgenden Absatz
# für jede Instanz einmal, und
# tragen bei ".port" diejenigen Ports ein,
# welche wir vorher in den server.xml's der
# Instanzen an den AJP1.3-Connector vergeben haben.
# in diesem Fall einmal 9001 und einmal 9002
# Als ".host" wird in diesem Fall nicht die virtuelle Domäne, sondern der Engine-Host eingetragen, und der ist in diesem und
# im Standartfall "localhost"
# Der Typ ist natürlich "ajp13"

worker.ajp13_1.port=9001
worker.ajp13_1.host=localhost
worker.ajp13_1.type=ajp13


# Instanz 2 sieht folglich so aus:
worker.ajp13_2.port=9002
worker.ajp13_2.host=localhost
worker.ajp13_2.type=ajp13

usw...

Nun machen wir uns an den Apache!
Wir öffnen jetzt mal ganz behutsam die
httpd.conf (ist die Apache-Config-Datei, und
sollte jedem Server-admin bestens bekannt sein...).

Ans Ende fügen wir einfach ein paar Zeilen hinzu,
und zwar folgende:

LoadModule jk_module /../mod_jk.so # Das Verzeichnis, woimmer ihr auch eure mod_jk abgelegt habt
AddModule mod_jk.c  # nix ändern


JkWorkersFile /../mod_jk/workers.properties # das Verzeichnis, in welchem die "workers.properties" liegt
JkLogFile    /../apache/logs/mod_jk.log # und die Datei, in welche Apache schimpfen darf...
JkLogLevel    info

<IfModule mod_jk.c>
    DirectoryIndex index.html index.htm index.jsp index.php index.php4
</IfModule>

# jetzt legen wir die Virtual-Domain für die erste Instanz an!

<VirtualHost 217.160.xxx.xxx:80>  # einen virtuellen Host im Apche anlegen für die lokale IP (man könnte auch localhost schreiben) auf dem gewünschten Port
  SSLEngine      off              # SSL aus
  DocumentRoot  /home/apps/test1/ # das Webapp-Verzeichnis für die erste Instanz
  ServerName    test1.halleluja.net # die virtuelle Domäne welche abgehört wird
  JkMount /*.jsp ajp13_1          # auf welchen AJP soll ich denn hören??? - den ajp13-worker der ersten Instanz aus der workers.properties eintragen
  JkMount /servlet/* ajp13_1      # das gleiche...
</VirtualHost>

# die der zweiten instanz würde dann also so aussehn:

<VirtualHost 217.160.xxx.xxx:80>
  SSLEngine      off
  DocumentRoot  /home/apps/test2/
  ServerName    test2.halleluja.net
  JkMount /*.jsp ajp13_2
  JkMount /servlet/* ajp13_2
</VirtualHost>


und so weiter...
Ich denke, man blickt durch.

so, dann starten wir jetzt mal die Tomcat-Instanzen, und ein wenig später den Apache...

Eingendlich sollte man jetzt über "http://test1.halleluja.net" die erste Instanz des Tomcat über den Apache geliefert bekommen und über "http://test2.halleluja.net"  die
zweite...
viel Erfolg!

Bei weiteren Fragen - meldet euch!

n.spataro@gmx.net

bye...
URL dieses Beitrags:
http://www.jsp-develop.de/forumbeitrag/view/7751/