Tomcat, Apache, mod_proxy, SSL
Ein weiteres Thema, was mich im Laufe des angesprochenen Projektes beschäftigte war das Thema Tomcat Hosting. Ich betreue schon einige kleinere Tomcat Seiten, habe mich aber nie so recht mit mod_jk anfreunden können (obwohl es funktioniert). Nun bin ich via Webinar von Springsource auf mod_proxy gestossen und empfand die Konfiguration von mod_proxy als wirklich simpel. Die Aufgabenstellung war die folgende: Ich wollte zwei Tomcat Knoten hinter einem Apache haben - nicht so sehr wegen höherer Performance sondern um mir die Möglichkeit zu geben einen Knoten bei einem Applikations-Update zu restarten ohne notwendigerweise die ganze Webseite abzuschalten - wobei alle SSL Arbeit der Apache/openssl erldedigen sollte. Ich habe also zwei Tomcats mit je zwei ajp Konnektoren aufgesetzt:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" URIEncoding="UTF-8" scheme="http" secure="false" proxyName="host.com" proxyPort="80" />
<!-- Define an AJP 1.3 Connector on port 8019 for 'secure' requests -->
<Connector port="8019" protocol="AJP/1.3" URIEncoding="UTF-8" scheme="https" secure="true" proxyName="host.com" proxyPort="443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">
Dabei empfangen beide Konnektoren unverschlüsselte Requests, da der Apache ja
die SSL Entschlüsselung vornimmt, allerdings wird einer der Konnektoren als
'secure' definiert, so daß ich dann im Applikationcode wissen kann ob der
Request via SSL kam oder nicht.
Weiterhin ist zu beachten, daß das jvmRoute Attribut im Engine Tag gesetzt
werden muß (auf unterschiedliche Werte in den beiden Tomcats).
Nun definiere ich zwei virtuelle Hosts im Apache, einen normalen und einen SSL
Host, dabei unterscheidet sich die Konfiguration mit Ausnahme der SSL
spezifischen Direktiven praktisch überhaupt nicht. Diese sieht ungefähr so aus:
# Cluster configuration
<Proxy balancer://tomcatcluster>
BalancerMember ajp://localhost:8009 route=node1
BalancerMember ajp://localhost:8010 route=node2
</Proxy>
# Pass all requests except the manager
# and some static resources to the cluster
ProxyPass /balancer-manager !
ProxyPass /css !
ProxyPass /js !
ProxyPass /images !
ProxyPass / balancer://tomcatcluster/ nofailover=On stickysession=JSESSIONID|jsessionid
# Configure the manager
<Location /balancer-manager>
SetHandler balancer-manager
Order Allow,Deny
Allow from localhost
</Location>
Die Module mod_proxy, mod_proxy_balancer und mod_proxy_ajp müssen dazu geladen
sein. Alternativ könnte man auch via http anstatt über ajp gehen und müsste
dann anstatt mod_proxy_ajp mod_proxy_http laden und die Konfiguration
entsprechend anpassen.
Dabei muß ich natürlich aufpassen, daß der nicht-SSL Host auch mit den als
nicht secure definierten Konnektoren spricht. Der Balancer Name
(tomcatcluster) kann frei gewählt werden.
Dann werden noch ein paar URIs vom proxying ausgespart (/balancer-manager,
/css, /js, /images) und die Arbeit ist getan.
Jetzt kann ich wenn ich auf http(s)://hostname/balancer-manager gehe die
einzelnen Cluster Mitglieder temporär vom Cluster ausschliessen.
Funktioniert bei mir wunderbar (Hosting Plattform ist openSUSE 11.0).
Allerdings habe ich nicht das bei openSUSE mitgelieferte Tomcat Paket
verwendet, sondern Vanilla Tomcats von tomcat.apache.org mit selbst
geschriebenen Init Skripten, da SuSE mehrere Tomcat Instanzen zwar vorsieht
aber das ganze nicht so wirklich funktionierend umgesetzt hat.
Posted at 06:03PM Dez 03, 2008 by joerg in Allgemein | Kommentare[2]
hi
wie könnte man es denn so machen, dass mehrere Tomcats auf Port 80 laufen oder, wenn man mehrere Kunden hat, dass zumindest die Kunden Ihre jsp nicht auf anderen Ports haben, sondern Standard auf 80?
grüße
Gesendet von Mihel am April 19, 2009 at 04:27 PM CEST #
Na ja, um mehrere Tomcats auf port 80 zu haben muß ich virtuelle hosts irgendeiner Art verwenden. Tomcat hat ein integriertes vhost feature und ich kann ja über oben beschriebenen Mechanismus auch mehrere Apache vhosts konfigurieren, die via mod_proxy oder mod_jk mit unterschiedlichen tomcat Instanzen sprechen.
Gesendet von Jörg Erdmenger am April 20, 2009 at 09:23 AM CEST #