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á:

  1. apt-get install libapache2-mod-jk
Následně přichází na řadu konfigurace Apache. V první řadě je třeba zmíněný modul nahrát. K tomu poslouží řádka v konfiguraci:
  1. 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:

  1. workers.tomcat_home=/usr/lib/apache-tomcat
  2. workers.java_home=/usr/lib/jvm/default-java
  3. ps=/
  4. worker.list=worker1
  5. worker.default.port=8009
  6. worker.default.host=localhost
  7. worker.default.type=ajp13
  8. worker.default.lbfactor=1
Dále do konfigurace Apache (mimo VirtualHost!) nastavíme naši konfiguraci workeru:
  1. JkWorkersFile /etc/apache2/workers.properties
Teď už zbývá udělat samotné mapování Javové aplikace. Tedy, konkrétní URL požadavky přesměrujeme na Tomcat. To zajistíme těmito dvoumi řádky (a ty už lze přidat i do VirtualHostu):
  1. JkMount /java-app worker1
  2. 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):

  1. <Connector port="8009" protocol="AJP/1.3" redirectPort="8080" />
Nyní už jen restartnout Tomcat a Apache a vše by mělo šlapat.