Předřazení Apache před Tomcat
Rychlý návod k tomu, jak před Tomcat server předřadit Apache tak, aby veškeré požadavky šly přes Apache. Jedná se jen o pár rychlých copy-pastů konfigurace, která funguje. Pro produkční nasazení doporučuji dále bádat. K sepsání mě vedlo to, že veškeré dostupné návody jsou poměrně dlouhé a ty starší navíc už dnes tak úplně nefungují. Postup byl zkoušen na Debian Squeeze.
Před samotnou konfigurací ještě rychlé shrnutí proč má cenu strkat jeden web server před druhý:
- Tomcat narozdíl od Apache umí spouštět Javové aplikace, ale chybí mu velká část nastavení, co Apache jinak umí
- Apache je na některé věci (např. servírování statických souborů) rychlejší než Tomcat a je proto výhodnější jej na tuhle část použít
V níže zmíněné konfiguraci tedy poběží web servery oba dva. Apache bude poslouchat na standardním portu 80 (či 443) a určité požadavky, dožadující se interakce Javové aplikace, bude předávat Tomcatu (a výsledky zpět uživateli). Co bude potřeba? Krom těchto zmíněných web serverů je třeba mod_jk do apache. Na debianu je instalace jednoduchá:
- apt-get install libapache2-mod-jk
- LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so
Nutno dodat, že na Debianu po instalaci toho proběhlo samo (v mods-enabled se automaticky vytvořil symlink na jk.load).
Dále připravíme konfiguraci Jk workeru. Do /etc/apache2/workers.properties přidáme:
- workers.tomcat_home=/usr/lib/apache-tomcat
- workers.java_home=/usr/lib/jvm/default-java
- ps=/
- worker.list=worker1
- worker.default.port=8009
- worker.default.host=localhost
- worker.default.type=ajp13
- worker.default.lbfactor=1
- JkWorkersFile /etc/apache2/workers.properties
- JkMount /java-app worker1
- JkMount /java-app/* worker1
Tím se zajistí, že všechny URL začínající java-app budou nacpány do Tomcatu, tedy úplně stejně, jako by požadavek šel na Tomcat rovnou.
Aby to fungovalo, je potřeba ještě v Tomcatu povolit AJP connector. To lze provést v /etc/tomcat6/server.xml. Daná řádka tam patrně je již zakomentovaná (možná s jiným portem - redirectPort by měl ukazovat na port, kde jinak Tomcat již standardně funguje):
- <Connector port="8009" protocol="AJP/1.3" redirectPort="8080" />