Hallo,
nachdem ich mich durch die Apache + Tomcat Konfiguration unter SuSE 9.1
gebissen habe, möchte ich nur mal kurz alle interessierte an meinen
Erkenntnissen teilhaben, das ganze basiert auf den Erkenntnissen, die
ich aus http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jk2/ gezogen
habe.
Zunächst die Aufgabenstellung:
------------------------------
Auf dem Webserver (Apache) sollen per Namensbasierenden Virtual Host
unterschiedliche Webseiten laufen, die auch Java Servlets enthalten
können. Die Servlets kann der Apache nicht abarbeiten und soll die an
den Tomcat weiterleiten.
Konfiguration Tomcat:
---------------------
Zunächst müssen die beiden RPMs jakarta-tomcat und
apache2-jakarta-tomcat-connectors installiert sein. Die
Konfigurationsdaten finden sich unter /etc/tomcat/base, angefasst hab
ich davon die server.xml und die jk2.properties. Die mitgelieferte
server.xml ist ein Riesenbrocken und wird erst mal auf die Seite
geschoben, da ist zu viel drinnen, was nur verwirrt ;-)
Reingenommen in die server.xml hab ich dann nur den Server selbst und
den "Tomcat-Apache" Service für die JK2 Anbindung, die ganzen
Standalone geschichten flogen raus, die müllen den Rechner nur mit
zusätzlichen Java-Prozessen zu und sorgen durch zusätzliche offene
Ports für potentielle Sicherheitslücken.
Die server.xml sieht letztendlich so aus (ich habs mal auf zwei Virtual
Hosts limitiert, jeder hat sein eigenes Servlet-Verzeichnis, unter
WEB-INF/classes liegen einzelne Servlet-Classes unt unter WEB-INF/lib
JavaArchive [jar-Files]):
------------------------------ start ----------------------------------
<Server port="8005" shutdown="SHUTDOWN" debug="0">
<Service name="Tomcat-Apache">
<!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 -->
<Connector className="org.apache.coyote.tomcat5.CoyoteConnector"
port="8009"
minProcessors="5"
maxProcessors="75"
enableLookups="true"
redirectPort="8443"
acceptCount="10"
debug="0"
connectionTimeout="20000"
useURIValidationHack="false"
protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/>
<!-- While starting off, leave debugging high for help in diagn. -->
<!-- When done, turn it back to 0 -->
<Engine name="Apache" defaultHost="www.eddie.mt" debug="9">
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="apache_log."
suffix=".txt"
timestamp="true"/>
<!-- Access log processes all requests for this virtual host. -->
<!-- Leave pattern="combined" for the most comprehensive logging -->
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="eddie_access_log."
suffix=".txt"
pattern="combined"
resolveHosts="false"/>
<Host name="www.knightsoft-net.mt" debug="0"
appBase="/srv/www/htdocs/manfred/www.knightsoft-net.de"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="" debug="0"/>
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="tomcat-knightsoft-net_access_log."
suffix=".txt" pattern="combined" resolveHosts="false"/>
</Host>
<Host name="www.eddie.mt" debug="0"
appBase="/srv/www/htdocs/manfred/"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="" debug="0"/>
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="tomcat-eddie-mt_access_log."
suffix=".txt" pattern="combined" resolveHosts="false"/>
</Host>
</Engine>
</Service>
</Server>
------------------------------- ende ----------------------------------
Für neue Virtual Hosts gibts einfach ne neuen neuen Host-Bereich.
In der jk2.properties ist standardmässig alles auf Kommentar,
letztendlich hab ich nur zwei Zeilen reingenommen:
------------------------------ start ----------------------------------
handler.list=channelSocket,request
channelSocket.port=8009
------------------------------- ende ----------------------------------
Fertig, Tomcat ist konfiguriert und ein beherztes '/etc/init.d/tomcat
start' sollte ihn ans laufen bringen.
Konfiguration Apache:
---------------------
Apache muss nun wissen, was er an Tomcat abtreten muss und was er selbst
zu erledigen hat. Zunächst brauchen wir das jk2 Modul, nehmen wir in
die /etc/sysconfig/apache2 bei den APACHE_MODULES mit auf (einfach
hinten bei der Liste der Module jk2 dazuschreiben) und dann mit
'SuSEconfig --module apache2' eine
neue /etc/apache2/sysconfig.d/loadmodule.conf generieren lassen.
Jetzt brauchen wir noch eine Konfiguration, die die Schnittstellendaten
enthält, diese Datei existiert derzeit nicht mal als Vorlage, also
bauen wir die neu auf als /etc/apache2/workers2.properties:
------------------------------ start ----------------------------------
# only at beginnin. In production uncomment it out
[logger.apache2]
level=ERROR
[shm]
file=/var/log/apache2/shm.file
size=1048576
# Example socket channel, override port and host.
[channel.socket:127.0.0.1:8009]
port=8009
host=127.0.0.1
# define the worker
[ajp13:127.0.0.1:8009]
channel=channel.socket:127.0.0.1:8009
# Uri mapping in the vhost configs
------------------------------- ende ----------------------------------
Ich hab wegen der IPV6 Problematiken bewusst die 127.0.0.1
hingeschrieben und nicht localhost verwendet. Am Ende das Uri mapping
hab ich ganz bewusst leer gelassen, da ich die individuellen
Konfigurationen in den Virtual-Host-Festlegungen vornehmen will. Wer da
was aufnehmen will, jedes Mapping würde wie folgt aussehen:
------------------------------ start ----------------------------------
[uri:www.knightsoft-net.mt/servlet/*]
worker=ajp13:127.0.0.1:8009
------------------------------- ende ----------------------------------
Was mir aus den Beschreibungen im Netz erst mal nicht klar wurde, die
workers2.properties wird nicht automatisch eingebunden, da hab ich
lange gesucht, warum das nicht klappt (machen andere Distributionen
vielleicht automatisch). Um das zu ermöglichen, hab ich mir
unter /etc/apache2/conf.d/mod_jk2.conf eine kleine Datei angelegt, die
das erledigt:
------------------------------ start ----------------------------------
#
# mod_jk2
#
<IfModule mod_jk2.c>
JkSet config:file /etc/apache2/workers2.properties
</IfModule>
------------------------------- ende ----------------------------------
Um die Virtual-Hosts Namensbasiert zu ermöglichen und nicht je einen
Port oder ne IP zu verbrauchen, hab ich da noch eine
Datei /etc/apache2/conf.d/name_virtual_host.conf angelegt, mit
folgenden Inhalt (Rechnername ist natürlich anzupassen):
------------------------------ start ----------------------------------
#
# eddie.tux.mt set NameVirtualHost
#
NameVirtualHost eddie.tux.mt
------------------------------- ende ----------------------------------
So viel zu der allgemeinen Konfiguration, jetzt gilts nur noch die
Virtual-Hosts anzulegen, hierfür reicht eine .conf Datei
in /etc/apache2/vhosts.d. Drinnen stehen muss nicht viel, wichtig für
die Servlets ist der JkUriSet worker, der für bestimmte Vorgaben die
Ausgabe zum Tomcat umlenkt. Hier die Dateien für die beiden vhosts aus
der Konfiguration oben:
-------------------- start www.eedie.mt.conf --------------------------
#
# www.eddie.mt config:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for requests without a known
# server name.
#
<VirtualHost eddie.tux.mt>
ServerAdmin manfred@eddie.tux.mt
ServerName www.eddie.mt
# needed for named virtual hosts
UseCanonicalName On
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory,
# but symbolic links and aliases may be used to point to other
# locations.
DocumentRoot /srv/www/htdocs/manfred/
# Give all /servlet/* URLs to Tomcat