Apache Webserver mit Tomcat verbinden

veröffentlicht am 21. März 2013

In meinen letzten Artikeln habe ich bereits die manuelle Tomcat Installation unter Linux und die Einrichtung von VirtualHosts bei Tomcat erläutert. Dieser Artikel zeigt nun die verschiedenen Möglichkeiten auf, um einen Apache Webserver vor den Tomcat zu schalten. Die Kombination aus Apache Webserver und Tomcat wird sehr häufig in Produktivumgebungen eingesetzt und bringt vielerlei Vorteile mit sich, da alle Möglichkeiten des Apache Webservers genutzt werden können.

Die hier gezeigten Methoden zum Verbinden des Apache Webserver mit Tomcat wurden unter Ubuntu 12.04 getestet. Es werden Kenntnisse über die Konfiguration des Apache Webservers und Tomcat vorausgesetzt.

Zunächst zeige ich die verschiedenen Möglichkeiten zum Verbinden des Apache Webservers mit Tomcat auf. Zum Schluss des Artikels werden Kriterien zur Auswahl der passenden Methode gegeben, die sich an den jeweiligen Anforderungen ausrichten sollte.

mod_jk

Die erste Möglichkeit, um den Apache Webserver mit Tomcat zu verbinden, besteht in der Verwendung des Apache Webserver Moduls mod_jk. Dieses muss zunächst per Paketverwaltung installiert werden:

aptitude install -y libapache2-mod-jk

Nach der Installation können in der Datei /etc/apache2/mods-enabled/jk.conf die Grundeinstellungen des Moduls, wie z.B. Logging und Sicherheit, eingestellt werden. Für den Anfang sind die Standardeinstellungen jedoch vollkommen ausreichend.

Interessanter wird es in der Datei /etc/libapache2-mod-jk/workers.properties. Hier müssen folgende Pfade angepasst werden:

workers.tomcat_home=<Tomcat Verzeichnis>
workers.java_home=<Java Verzeichnis>

Diese Datei ist auch für die Konfiguration der so genannten worker zuständig. Die offizielle Dokumentation definiert worker wie folgt:

A Tomcat worker is a Tomcat instance that is waiting to execute servlets on behalf of some web server.

Ein worker ist also vereinfacht ausgedrückt eine Tomcat Instanz, die Anfragen unseres Webservers verarbeitet. Es existieren drei worker Typen, die mit dem aktuellen Tomcat in Version 7 verwendet werden können:

Typ Beschreibung
ajp13 Dieser Worker verwendet das Apache JServ Protocol (AJP) der Version 1.3 und wird hier zur Verbindung des Apache Webservers mit Tomcat verwendet
lb lb steht für load balancer und wird in hochperformanten Systemen zur Lastverteilung auf verschiedene Tomcat Server verwendet
status Dieser Worker Typ dient der Verwaltung und Überwachung der eben angesprochenen lb Worker

Standardmäßig ist bereits folgender ajp13 worker namens ‘ajp13_worker’ definiert:

worker.list=ajp13_worker            # kommaseparierte Liste aller anzulegender worker
worker.ajp13_worker.port=8009       # Port des Tomcat Servers über den die AJP Verbindung hergestellt wird
worker.ajp13_worker.host=localhost  # Host des Tomcat Servers
worker.ajp13_worker.type=ajp13      # worker Typ
worker.ajp13_worker.lbfactor=1      # Faktor für Lastverteilung (muss > 0 sein)

Für den Einstieg reichen diese Einstellungen bereits aus. Sollte der Tomcat auf einem anderen Computer laufen, müssen natürlich die Verbindungsdaten angepasst werden. In größeren Umgebungen oder bei speziellen Anforderungen, können hier weitere worker definiert und feiner angepasst werden. Die offizielle worker Dokumentation ist hierbei zu Rate zu ziehen.

Jetzt kann der Apache Webserver mit Tomcat verbunden werden. Hierzu wird die Konfiguration des gewünschten VirtualHosts des Apache Webservers geöffnet. Dort wird über die Direktive JkMount festgelegt, welche Anfragen an Tomcat weitergeleitet werden sollen. Bei dem Eintrag muss unbedingt darauf geachtet werden, den Namen eines gültigen workers anzugeben. Eine minimale Konfiguration könnte so aussehen:

<VirtualHost *:80>
        ServerName tomcat.patrick-gotthard.de
        JkMount /* ajp13_worker
</VirtualHost>

Es kann natürlich detaillierter angegeben werden, welche Anfragen an den Tomcat weitergeleitet werden sollen. Außerdem ist es möglich, statische Ressourcen wie z.B. Bilder direkt vom Apache Webserver ausliefern zu lassen. Hierzu verweise ich auf die offizielle Apache Tomcat Connector Dokumentation.

mod_proxy_ajp

Eine weitere Möglichkeit, den Apache Webserver mit Tomcat zu verbinden, besteht in der Nutzung des bereits vom Apache Webserver mitgelieferten Moduls mod_proxy_ajp. Dieses Modul nutzt genauso wie mod_jk das Apache JServ Protocol (AJP), erleichtert jedoch die Einrichtung, da nur die VirtualHost Konfiguration des Apache Webservers angepasst werden muss.

<VirtualHost *:80>
	ServerName tomcat.patrick-gotthard.de
	ProxyPass / ajp://localhost:8009/
</VirtualHost>

mod_proxy_http

Das Modul mod_proxy_http ist ebenso wie das Modul mod_proxy_ajp bereits im Lieferumfang des Apache Webservers enthalten. Es arbeitet wie ein ganz normaler HTTP Reverse Proxy und leitet die Anfragen einfach an den angegebenen Server weiter. Die Konfiguration ist deshalb denkbar einfach:

<VirtualHost *:80>
	ServerName tomcat.patrick-gotthard.de
	ProxyPreserveHost on
	ProxyPass / http://localhost:8080/
</VirtualHost>

Wichtig ist hierbei der Eintrag ProxyPreserveHost. Beim Durchreichen der Anfrage wird in der Standardeinstellung der angefragte Host zu dem bei ProxyPass angegebenen Host abgeändert (in diesem Fall localhost). Durch setzen dieser Einstellung, bleibt der angefragte Hostname unangetastet.

mod_jk, mod_proxy_ajp oder mod_proxy_http einsetzen?

Nachdem die verschiedenen Varianten zum Verbinden des Apache Webservers mit Tomcat aufgezeigt wurden, muss überlegt werden, welche Variante für den eigenen Anwendungsfall verwendet werden sollte. Folgende Tabelle stellt eine Zusammenfassung verschiedener Quellen dar:

mod_jk mod_proxy_ajp mod_proxy_http
Protokoll zwischen Webserver und Tomcat AJP AJP HTTP / HTTPS
Komprimierte Übertragung der Client Anfrage ja ja nein
Bereits in Apache Webserver integriert nein ja ja
Kommunikation verschlüsselt nein * nein * ja (bei HTTPS)
SSL Informationen der Client Anfrage werden durchgereicht ja ja nein *
Einfache (Grund-)Einrichtung nein ja ja
Maximale Paketgröße 64kB 8kB unbegrenzt
Loadbalancing Möglichkeit umfangreich  rudimentär nein *

* nur manuell nachkonfigurierbar

Für detailliertere Erläuterungen sollten die Quellen zu Rate gezogen werden:

Kommentare

Hi,

bisher dachte ich Tomcat und Apache seien das Selbe… Wo ist denn da jetzt der Unterschied?

Grüße

Jo

Kommentar #1 von Joachim am 28. August 2014


Hinterlasse einen Kommentar