Tomcat, Apache, mod_jk и FreeBSD
WTF: имам работещо Apache. Пиша java web application и искам той да се търкаля на port 80 на един от VHost-овете му. В моя случай към Apache-то имам закачени 30-тина домейна с по няколко VHost-а за всеки от домейните (т.е. домейните са като VHosts, техните sub-домейни – също). За пример – http://adilov.net и http://blog.adilov.net.
Вариант 1: Tomcat слуша на порт 80. В текущия случай - невъзможно, имам Аpache там. Вариантът отпада :)
Вариант 2: Apache-то да пренасочва по някакъв начин към Tomcat. Ами – по-добрият вариант. Даже перфектният – статичното съдържание ще се сервира от Apache-то и няма да тормозя java процеса с глупости, а динамичното – от Tomcat. Как? С mod_jk. И под FreeBSD, естествено :)
Стъпките по инсталацията на Apache и Tomcat ще ги пропусна, те са ясни. За дефолтни инсталации – /usr/ports/www/apache22 и /usr/ports/www/tomcat6.
Трябва ни обаче и инсталиран mod_jk. В ports-дървото той се намира в /usr/ports/www/mod_jk. Инсталираме го и добавяме в httpd.conf (ако не се намира на default-ното място и липсва поне един ред, започващ с LoadModule) “LoadModule jk_module libexec/apache22/mod_jk.so” – ако mod_jk се намира в тази директория и без кавичките.
Обикновено httpd.conf include-ва всички .conf файлове от Includes, затова нека направим един там – tomcat.conf:
1 2 3 4 | JkWorkersFile /usr/local/apache-tomcat6.0/conf/workers.properties JkLogFile /var/log/jk.log JkShmFile /var/log/jk-runtime-status JkLogLevel error |
Тук забелязваме default-ната инсталационна директория на Tomcat – /usr/local/apache-tomcat6.0 и съответно я заместваме с реалната. Нека се прехвърлим за момент в %TOMCAT_HOME%/conf и да създадем файл workers.properties:
1 2 3 4 5 | worker.list=java worker.java.port=8009 worker.java.host=192.168.10.1 worker.java.type=ajp13 worker.java.lbfactor=1 |
Портът, който виждаме е default-ния, а ако искаме custom – онзи от server.xml, в node “Connector” с “protocol=AJP/1.3“. IP-то е интересно. Нарочно го пиша различно, за да се забелязва отдалече. Ако слагаме Tomcat в Jail – това е адресът на Jail-a.
Готови сме с Tomcat/Apache конфигурационните файлове. Нека погледнем VHost-овете. Отваряме някой от VHost конфигурационните файлове (а може би http.conf, ако някой го е домързяло да ги отдели… Както казах при по-голямо количество VHost-ове доста по-удобно става разделението по директории и файлове.) и в него пишем:
1 | JkMount /* java |
Мда, /* е еквивалентно на / в Tomcat, т.е. webapps/ROOT. Записваме промените и стартираме Tomcat и Apache и ако приемем, че VHost-ът е за http://sub.int.yo, при отварането му би трябвало да видим дефолтната страничка на Tomcat (webapps/ROOT/index.html). Честито!
PS: Т’ва работи и не само за fBSD (yeah.), изключваме частта с /usr/ports и пърхаме нататък.
А можеш ли да post-неш и частта с описанието от страна на apache-то на virtual-ните host-ве.
Аз също си правя подобна конфигурация, но нямам jail-ове. Та ми е интерсно дали имаш идея как да станат работите със много tomcat-и (на виртуален хост по един или нула) и един apache, с един ip address. Явно е, че ми трябва name-based конфигурация, но …
Не схващам идеята за повече от един tomcat per apache virtual host. Искаш да ползваш apache-то за balancer?
EDIT: Опа, моя грешка. Ами можеш във всеки vhost на апачето да сложиш частта с IfModule mod_jk, като всеки от томкетите да слуша на различен порт. Ное съм сигурен дали има смисъл, обаче. Вероятно ще е по-добре да се пуснат и vhost-ове на tomcat и пак ще са отделни. По този начин можеш да спестиш доста class-loading от страна на споделени библиотеки.