Da der Apache Webserver wesentlich leistungsfähiger und flexibler als der integrierte Webserver des Tomcat ist, ist es sinnvoll diesen auch einzusetzen. Zusätzlich können wir auf die Apache Module zurückgreifen und das vHost Management verwenden. Die Lösung wird via dem Apache Modul mod_jk realisiert, welches sämtliche Webserveranforderungen über das AJP Protokoll an den Tomcat weiterleitet.
Vorbereitung
*) Apache Tomcat 7 Installation wie in diesem HowTo beschrieben
*) Apache Webserver Installation (mod_jk kann auch in bestehende Installationen integriert werden)
[bash]aptitude install apache2[/bash]Installation und Konfiguration des mod_jk Apache Moduls
Das mod_jk Apache Modul kann bequem über das Debian Repository installiert werden:
[bash]aptitude install libapache2-mod-jk[/bash]Debian installiert dabei bereits die entsprechende Beispielkonfiguration mit, welche wir für unsere Zwecke editieren. Wenn die Tomcat Installation noch bei der Standardinstallation belassen wurde, müssen nur die ersten beiden Werte angepasst werden.
[bash]vi /etc/libapache2-mod-jk/workers.properties[/bash] [plain]workers.tomcat_home=/usr/local/tomcatworkers.java_home=/usr/lib/jvm/java-7-oracle
ps=/
worker.list=ajp13_worker
worker.ajp13_worker.port=8009
worker.ajp13_worker.host=localhost
worker.ajp13_worker.type=ajp13
worker.ajp13_worker.lbfactor=1[/plain]
In folgendem Schritt erstellen wir die Apache Modul Konfigurationsdatei für mod_jk mit folgenden Werten (Nur bei Debian 6 Squeeze notwendig) Wheezy erstellt die Konfiguration bereits in der Datei /etc/apache2/mods-enabled/jk.conf:
[bash]vi /etc/apache2/conf.d/mod-jk.conf[/bash] [plain]JkWorkersFile /etc/libapache2-mod-jk/workers.propertiesJkLogFile /var/log/apache2/mod_jk.log
JkLogLevel error
JkShmFile /var/log/apache2/jk-runtime-status[/plain]
Apache vHost (Virtual Host) erstellen
Da nun die Grundkonfiguration des mod_jk abgeschlossen ist, legen wir nun einen vHost für eine Testdomain auf unseren Apache Webserver an (zB:. vhost.domain.com) und laden via JkMount den ajp13_worker nach /:
[bash]vi /etc/apache2/sites-available/vhost.domain.com[/bash][xml]<Virtualhost vhost.domain.com>
JkMount /* ajp13_worker
ServerName vhost.domain.com
DocumentRoot /usr/local/tomcat/webapps
ErrorLog /usr/local/tomcat/logs/error.log
CustomLog /usr/local/tomcat/logs/access.log common
<Directory /usr/local/tomcat/webapps>
Options -Indexes
</Directory>
</Virtualhost>[/xml]
Nun aktivieren wir den neuen vHost und starten den Apache Webserver neu:
[bash]a2ensite vhost.domain.com/etc/init.d/apache2 restart[/bash]
Tomcat vHost (Virtual Host) konfigurieren
Da nun der Apache Webserver soweit konfiguriert ist um mit dem Tomcat über den AJP Connector zu kommunizieren, müssen wir die vHosts für den Tomcat noch entsprechend einrichten. In folgendem Beispiel wird die Domain vhost.domain.com auf das Beispiel Verzeichnis des Tomcats konfiguriert (/usr/local/tomcat/webapps/examples).
[sam id=’2′ codes=’true‘] [bash]vi /usr/local/tomcat/conf/server.xml[/bash][xml] <Host name="vhost.domain.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path=""
docBase="/usr/local/tomcat/webapps/examples"
debug="0" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>[/xml]
Damit die Konfiguration aktiv wird starten wir den Tomcat neu:
[bash]/etc/init.d/tomcat stop/etc/init.d/tomcat start [/bash]
Testen der Apache mod_jk Tomcat Integration
Nun kann im via Browser auf den entsprechenden Hostnamen zugegriffen werden wo unsere Beispiele angezeigt werden sollte:
Vielen Dank für die Anleitung. Ich werde mal versuchen, die Eins zu Eins umzusetzen. Ich bin mal gespannt, ob es bei mir klappt.
Funktioniert zwar wie beschrieben, allerdings wurden bei mir alle Domains auf den Tomcat umgeleitet, auch solche die eigentlich auf PHP-Anwendungen verweisen, die vom Apache ausgeliefert werden müssen. Wie kommt das? Ich hab wie beschrieben einen Virtualhost nur für eine einzelne Domain angelegt. Alle anderen haben normale Einträge in sites-available.
Hi Jack,
Wie sind denn die anderen VirtualHost ….. Direktiven eingetragen? Also der Wert von ….. Eventuell liegt hier der Fehler begraben?
Gruß Patrick
Vielen Dank für die Anleitung. Funktioniert zwar wie beschrieben allerdings nur local d.h. wenn ich die Adresse von einem anderem Rechner aufrufe mit der IP am Anfang z.b. 192.168.1.100/vhost.domain.com bekomme ich nur eine 404 Fehlermeldung.
Hi Tomek,
wie lautet denn die Fehlermeldung?
Ist die Domain auch sauber im Apache konfiguriert und stimmt die Zuordnung in den VirtualHosts Direktiven?
Gruß
Patrick
HTTP Status 404 – /vhost.domain.com
type Status report
message /vhost.domain.com
description The requested resource (/vhost.domain.com) is not available.
Apache Tomcat/7.0.28
Was meinst Du mit „Ist die Domain auch sauber im Apache konfiguriert“? Habe eigentlich nicht mehr aber auch nicht weniger gemacht als in deiner Anleitung stand 🙂
Hi,
Hast du als Hostnamen im Apache wirklich vhost.domain.com genommen oder das nur als Test hier reingeschrieben?
Gruß
Patrick
genommen habe ich tomcat-examples.mydomain.de und vhost.domain.com verwende ich hier um es ohne umzudenken mit den Beispielen von oben vergleichen zu können
kannst du mal die Logdateien Überprüfen? /var/log/apache2/mod_jk.log und /usr/local/tomcat/logs/error.log
Hi,
deine Anleitung ist super, danke!
ich habe als vhost meine Domain irgendwas.com eingetragen. Wenn ich die Domain jetzt aufrufe erscheint die Default Seite „It Works…“ denke mal vom Apache.. Im Tomcat log steht auch immer noch die Meldung.. von wegen The APR based Apache Tomcat Native … sollte die nicht verschwinden?
muss ich den Tomcat nicht auch auf Port 80 umstellen? das gibt aber auch nen Konflikt mit dem Apache ..
weiß grade net mehr weiter.
würde gerne die Anwendung die ich in der docbase statt examples angegeben habe sehen 🙂
gruß
Hallo Johann,
der Tomcat darf nicht auf dem Port 80 laufen, weil da ja dein Apache Webserver läuft.
Dieser integriert den Tomcat über den AJP Port (8009).
Eigentlich funktioniert die Anleitung so wie sie geschrieben ist, hast du vielleicht einen Schritt ausgelassen?
Apache und Tomcat neu gestartet?
Logfiles im Apache überprüft?
Gruß
Patrick
Hi,
ich hatte das gleiche Problem. Wie habe ich es gelöst?
1. In der server.xml von dem Tomcat folgende Zeile einkommentiert:
2. Beim Apache den ssl-Mod aktiviert: a2enmod ssl
Ok … die Zeile die ich unter Punkt 1 angesprochen habe wird nicht angezeigt xD
Im Kommentar über der Zeile steht „Define an AJP 1.3 Connector on port 8009″. Das ist ein Connector mit protocol=“AJP/1.3“.
Ok, sry, noch eine korrektur.
Das mit ssl war natürlich quark :P. Seltsamerweise funktioniert das nie nach startup des Servers. Erst wenn ich (nach einem server reboot) den apache nochmal restarte, funktioniert das.
Seltsam -.-„
Danke für das Skript. Mit mehreren Tomcat-Instanzen auf einem System funktioniert es aber nicht richtig, ich habe es so umgebaut dass es PID-Files verwendet:
21a22
> CATALINA_PID=“$TOMCAT_PATH/logs/tomcat.pid“
23c24
28c29,30
export CATALINA_PID
>
30,31c32,36
< echo `ps aux | grep org.apache.catalina.startup.Bootstrap | grep -v grep | awk '{ print $2 }'`
if [ -f $CATALINA_PID ]
> then
> cat $CATALINA_PID
> fi
> }
Hallo habe das ganze auf meinem Raspberry Pi versucht. Leider kann ich den Host nicht aufrufen. Im Tomcat wird er mir zwar angezeigt, wenn ich die Domain aber aufrufe kommt immer „Service Temporarily Unavailable“.
Hat es evtl. damit zu tun, dass mein „Server“ über eine Subdomain erreichbar ist? rasp.meineDomain.de?
Den Vhost habe ich als vhost.rasp.meineDomain.de angemeldet.
Die Apache logs sagen folgendes:
[Sat Aug 23 12:08:34.326 2014] [18127:3068981248] [info] init_jk::mod_jk.c (3365): mod_jk/1.2.37 initialized
[Sat Aug 23 12:08:34.326 2014] [18127:3068981248] [error] extension_fix::jk_uri_worker_map.c (564): Could not find worker with name ‚jk-manager‘ in uri map post processing.
[Sat Aug 23 12:08:34.327 2014] [18127:3068981248] [error] extension_fix::jk_uri_worker_map.c (564): Could not find worker with name ‚jk-status‘ in uri map post processing.
In Deiner Tomcat server.xml hast Du wahrscheinlich nicht den AJP connector aktiviert (ist bei tomcat7 auf wheezy by default auskommentiert: