Итак, прошло пара дней, хостинг и домен были подняты.
Далее я перешел к теме которую знал только по наслышке, правда очень хорошо. Конечно апача ставят в переди томката в основном для распределения нагрузки, что мне пока не требовалось, но даже без балансировки котенок Том чувствует себя под защитой воинственного индейца гораздо уверенней. Что же предстояло сделать на этот раз
1. Прячем томкат за апачем с помощью mod_jk
2. Стараемся спрятать урлы томката (контекст и маппинги) на доменах третьего уровня. Сразу оговорюсь - почему стараемся, не во всех случаях это возможно.
В общем можно было посадить томкат за чем-нибудь более легковесным, например nginx'ом, lighttpd или varnish, вариантов много, однако времени в обрез и совсем не в кайф заниматься изучением технологий ради изучения, и так багаж бесполезных знаний после исправления несуществующей проблемы bind трещал по швам.
Понеслась :)
1. Настраиваем mod_jk
В сети оказалось на удивление материалов по этой теме и как ни странно самыми вменямыми оказались какой-то внутренний доковский документ и официальная документация проекта Apache Tomcat Connectors. Просмотрев пару верхних ссылок гугла, я уже бросился компилять коннектор из сырцов, но что-то меня остановило. И правильно. В конце первой страницы гугловой выдачи я нашел тот странный вордовский документ в котором описывалось как ставить mod_jk в убунте. Явно он предназначался или для внутреннего использования, или для клиентов какой-то компании. Хоть документ был и не очень актуальным, он повел меня в правильном направлении. Ставим mod_jk
sudo apt-get install libapache2-mod-jk
Пакет заботливо создал директорию /etc/libapache2-mod-jk а в ней в общем вполне рабочий конфиг - workers.properties. Остается включить mod-jk в настройках апача:
Создаем в /etc/apache2/conf.d файл конфигурации допустим jk.conf имя не имеет значения, т.к. апач инклудит все файлы из каталога /etc/apache2/conf.d в основной конфиг. Соержимое файла примерно такое
root@Ubuntu-1004-lucid-32-minimal /etc/apache2/conf.d # cat jk.conf
JkWorkersFile /etc/libapache2-mod-jk/workers.properties
JkLogFile /var/log/apache2/mod_jk.log
JkLogLevel info
JkShmFile /var/run/apache2/mod_jk.shm
Собственно в особых комментариях не нуждается - мы последовательно указываем наш конфиг с определением воркеров, лог-файл и уровень лога, а так же файл куда отображается расшаренная между воркерами память. Выполняем в шелле
a2enmod jk
рестартуем апач, mod-jk работает, о чем видим соотвествующие записи в логах.
Вторая проблема - Посадить разные части приложения на разные домены третьего уровня и по возможности убрать лишее в url приложения. Веб-приложение состояло из двух частей. Одна написана с использованием Wicket, другая на простом сервлете, с простеньким самопальным диспетчером и шаблонами Velocity. Как известно у томката маппинги настраиваются от url веб-приложения. Т.е. если мы задеплоили приложение WebApp.war в котором сервлет отмаплен на url - /* то это значит что сервлет будет обрабатывать запросы вид http://server_address/WebApp/*. Задача была сделать так что бы сервлет обрабатывал все запросы вида webapp.server_address Забегая вперед скажу что это хорошо получилось только для случая использования чистого сервлета, сразу не получилось использовать в случае веб-фреймворка Wicket. Однако это было допустимо и так и решил сделать.
1. Добавляем виртуальный хост апача для сервлета
Сервлет у нас отмаплен в веб-приложении на путь /drv/*
Создаем в /etc/apache2/sites-available/ файл с описанием нашего виртуального хоста, например drv.example.ru с таким содержимым
RewriteRule /(.*) /WebApp/drv/$1 [PT] - тоже вполне понятная директива, magic здесь в флагах passthrough ([PT]) - без них не работает.
Т.к. диспетчер самопальный не составило особого труда понять какие url приходят в сервлет на самом деле, викинуть ненужное и обрабатывать правильно, т.е. в итоге сервлет работал по адресу drv.example.ru
С сервлетом на Wicket дела обстоят хуже, т.к. у него собственный диспетчер URL, наверное, если сильно постараться можно добиться требуемого эффекта и с ним, но в моем случае это поведение было приемлемым, поэтому оставил так. По моему в Wicket 1.5 это как-то сильно улучшили, но пока еще не разбирался.
Далее я перешел к теме которую знал только по наслышке, правда очень хорошо. Конечно апача ставят в переди томката в основном для распределения нагрузки, что мне пока не требовалось, но даже без балансировки котенок Том чувствует себя под защитой воинственного индейца гораздо уверенней. Что же предстояло сделать на этот раз
1. Прячем томкат за апачем с помощью mod_jk
2. Стараемся спрятать урлы томката (контекст и маппинги) на доменах третьего уровня. Сразу оговорюсь - почему стараемся, не во всех случаях это возможно.
В общем можно было посадить томкат за чем-нибудь более легковесным, например nginx'ом, lighttpd или varnish, вариантов много, однако времени в обрез и совсем не в кайф заниматься изучением технологий ради изучения, и так багаж бесполезных знаний после исправления несуществующей проблемы bind трещал по швам.
Понеслась :)
1. Настраиваем mod_jk
В сети оказалось на удивление материалов по этой теме и как ни странно самыми вменямыми оказались какой-то внутренний доковский документ и официальная документация проекта Apache Tomcat Connectors. Просмотрев пару верхних ссылок гугла, я уже бросился компилять коннектор из сырцов, но что-то меня остановило. И правильно. В конце первой страницы гугловой выдачи я нашел тот странный вордовский документ в котором описывалось как ставить mod_jk в убунте. Явно он предназначался или для внутреннего использования, или для клиентов какой-то компании. Хоть документ был и не очень актуальным, он повел меня в правильном направлении. Ставим mod_jk
sudo apt-get install libapache2-mod-jk
Пакет заботливо создал директорию /etc/libapache2-mod-jk а в ней в общем вполне рабочий конфиг - workers.properties. Остается включить mod-jk в настройках апача:
Создаем в /etc/apache2/conf.d файл конфигурации допустим jk.conf имя не имеет значения, т.к. апач инклудит все файлы из каталога /etc/apache2/conf.d в основной конфиг. Соержимое файла примерно такое
root@Ubuntu-1004-lucid-32-minimal /etc/apache2/conf.d # cat jk.conf
JkWorkersFile /etc/libapache2-mod-jk/workers.properties
JkLogFile /var/log/apache2/mod_jk.log
JkLogLevel info
JkShmFile /var/run/apache2/mod_jk.shm
Собственно в особых комментариях не нуждается - мы последовательно указываем наш конфиг с определением воркеров, лог-файл и уровень лога, а так же файл куда отображается расшаренная между воркерами память. Выполняем в шелле
a2enmod jk
рестартуем апач, mod-jk работает, о чем видим соотвествующие записи в логах.
Вторая проблема - Посадить разные части приложения на разные домены третьего уровня и по возможности убрать лишее в url приложения. Веб-приложение состояло из двух частей. Одна написана с использованием Wicket, другая на простом сервлете, с простеньким самопальным диспетчером и шаблонами Velocity. Как известно у томката маппинги настраиваются от url веб-приложения. Т.е. если мы задеплоили приложение WebApp.war в котором сервлет отмаплен на url - /* то это значит что сервлет будет обрабатывать запросы вид http://server_address/WebApp/*. Задача была сделать так что бы сервлет обрабатывал все запросы вида webapp.server_address Забегая вперед скажу что это хорошо получилось только для случая использования чистого сервлета, сразу не получилось использовать в случае веб-фреймворка Wicket. Однако это было допустимо и так и решил сделать.
1. Добавляем виртуальный хост апача для сервлета
Сервлет у нас отмаплен в веб-приложении на путь /drv/*
Создаем в /etc/apache2/sites-available/ файл с описанием нашего виртуального хоста, например drv.example.ru с таким содержимым
root@Ubuntu-1004-lucid-32-minimal /etc/apache2/sites-available # cat drv.example.ru
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName drv.example.ru
JkMount /* ajp13_worker
JkLogFile /var/log/apache2/drv.modjk.log
JkLogLevel debug
RewriteEngine on
RewriteRule /(.*) /WebApp/drv/$1 [PT]
RewriteLog /var/log/apache2/drv.rewrite.log
RewriteLog 9
ErrorLog /var/log/apache2/drv.error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/drv.access.log combined
</VirtualHost>
Ключевым я бы тут назвал строку RewriteRule /(.*) /WebApp/drv/$1 [PT], все остальное довольно прозрачно - директивой JkMount /* ajp13_worker говорим что все урл от корня этого виртуального сервера должны обрабатываться jk воркером ajp13_worker (он у нас один :) )RewriteRule /(.*) /WebApp/drv/$1 [PT] - тоже вполне понятная директива, magic здесь в флагах passthrough ([PT]) - без них не работает.
Т.к. диспетчер самопальный не составило особого труда понять какие url приходят в сервлет на самом деле, викинуть ненужное и обрабатывать правильно, т.е. в итоге сервлет работал по адресу drv.example.ru
С сервлетом на Wicket дела обстоят хуже, т.к. у него собственный диспетчер URL, наверное, если сильно постараться можно добиться требуемого эффекта и с ним, но в моем случае это поведение было приемлемым, поэтому оставил так. По моему в Wicket 1.5 это как-то сильно улучшили, но пока еще не разбирался.



