Home > How to, Софтуер > Tomcat, Apache, mod_jk и FreeBSD

Tomcat, Apache, mod_jk и FreeBSD

March 11th, 2009 Leave a comment Go to comments

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 и пърхаме нататък.

  1. March 27th, 2009 at 16:36 | #1

    А можеш ли да post-неш и частта с описанието от страна на apache-то на virtual-ните host-ве.
    Аз също си правя подобна конфигурация, но нямам jail-ове. Та ми е интерсно дали имаш идея как да станат работите със много tomcat-и (на виртуален хост по един или нула) и един apache, с един ip address. Явно е, че ми трябва name-based конфигурация, но …

  2. March 29th, 2009 at 11:38 | #2

    Не схващам идеята за повече от един tomcat per apache virtual host. Искаш да ползваш apache-то за balancer?

    EDIT: Опа, моя грешка. Ами можеш във всеки vhost на апачето да сложиш частта с IfModule mod_jk, като всеки от томкетите да слуша на различен порт. Ное съм сигурен дали има смисъл, обаче. Вероятно ще е по-добре да се пуснат и vhost-ове на tomcat и пак ще са отделни. По този начин можеш да спестиш доста class-loading от страна на споделени библиотеки.

  1. No trackbacks yet.