In der heutigen Folge von ‚Probleme die die Welt nicht braucht‘ beschäftigen wir uns mit dem Verbinden von Apache2 und Tomcat5.5 mittels mod_jk auf einem Debian Etch. Weil wir penibel sind, wollen wir aber nur eine einzelne Subdomain auf den Tomcat legen, der Rest vom Schützenfest soll unberührt bleiben. Zur Krönung macht uns ein laufendes SysCP, das eigentlich alle Domains und damit auch Subdomains verwaltet noch einen Strich durch die Rechnung.
Zuerst sollte der wilde Haufen mal wie hier beschrieben installiert sein, und vor allem laufen.

Und los:
Zuerst bauen wir uns einen Worker in /etc/apache2/workers.properties:

# wir definieren den pfad zum tomcat und java homeverzeichnis
# sowie einen pfadseparierer
workers.tomcat_home=/var/lib/tomcat5.5
workers.java_home=/usr/lib/jvm/java-1.5.0-sun-1.5.0.14
ps=/

# name des/der worker, durch kommata getrennt
worker.list=arbeiter

# hier noch den port, auf dem der worker arbeitet, seine URL
# und das protokoll (ajp12 ist depricated und lb wäre für den loadbalancer)
worker.arbeiter.port=8009
worker.arbeiter.host=sub.domain.tld
worker.arbeiter.type=ajp13

Mehr zu Workern gibs hier

Wir schreiten zur Konfiguration der Tomcat server.xml.
Zuerst kommentiere man die Host-Direktive mit Namen localhost aus und füge folgende, an die eingenen Ansprüche angepasste ein:



unpackWARs=“true“ autoDeploy=“true“>



WEB-INF/web.xml


directory=“logs“ prefix=“project_name_access_log.“ suffix=“.txt“
pattern=“common“ resolveHosts=“false“/>



Man führe sich hierzu noch folgende Links zu Gemüte:
Engine Container
Host Container
Context Container

Ein Tomcat Reload sollte jetzt automatisch die /var/lib/tomcat5.5/conf/auto/mod_jk.conf erstellen. Das tut er aber nur, wenn der Apache gestoppt ist; Also:

# /etc/init.d/apache2 stop
# /etc/init.d/tomcat5.5 restart
# /etc/init.d/apache2 start

mod_jk.conf wurde brav automatisch erstellt.
Wenn wir diese in apache2.conf includen sollte der Apache beim starten motzen; Igendwas über -Direktiven in -Direktiven und/oder

[Thu Jun 12 21:13:24 2008] [error] VirtualHost sub.domain.tld:0 — mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results

Problem 1 mit den s liegt daran, dass der virtuelle Host zwei mal definiert ist, in unserem Fall eine Subdomain im SysCP. Also Subdomain raus aus dem SysCP, die konfigurieren wir selbst. Problem 2 liegt an der schwachen Autoconfig vom Tomcat, machen wir auch selbst:

# rm -dr /var/lib/tomcat5.5/conf/auto
# vi /etc/apache2/sites-enabled/mod_jk.conf


LoadModule jk_module „/usr/lib/apache2/modules/mod_jk.so“

JkWorkersFile „/etc/apache2/workers.properties“
JkLogFile „/usr/share/tomcat5.5/logs/mod_jk.log“

JkLogLevel debug


ServerName sub.domain.tld
ServerAlias www.sub.domain.tld
ServerAdmin admin@nimda.com
DocumentRoot „/var/lib/tomcat5.5/webapps“

JkMount / arbeiter
JkMount /* arbeiter

Sollte generell selbsterklärend sein, allerdings sollte man bei den JkMounts beachten, den Worker beim Namen zu nennen und nicht nur auf das Protokoll zu verweisen.
Interessanter Lesestoff hierzu: Webserver Howto und zugehörige Reference

# apache2ctl configtest
Syntax OK
# /etc/init.d/apache2 restart

Geschafft 😉

Bonustipp:

SEVERE: Caught exception executing
org.apache.tomcat.util.net.TcpWorkerThread@1e4eb5b, terminating thread
org.apache.commons.logging.LogConfigurationException:
org.apache.commons.logging.LogConfigurationException:
org.apache.commons.logging.LogConfigurationException: Class org.apache.commons.logging.impl.Log4JCategoryLog does not implement Log
at org.apache.commons.logging.impl.LogFactoryImpl.newInstance (LogFactoryImpl.java:555)

Sollte der Tomcat beim hochfahren mehrere Hände voll solcher SEVERE Errors ins Logfile schießen, hilft es auf die Jakarta/Apache Commons Logging im /WEB-INF/lib der Java-Webprojekte zu verzichten …