Рано или поздно приходишь к тому, что на сервере Tomcat хочется держать не только один сайт. можно конечно же разные сайты делить за тем же Nginx по запросам к подкаталогу "/domain-name", но правильнее будет сделать разнесение по виртуальным хостам. ещё правильнее - разнести "клиентов" ещё и по разным инстансам tomcat (чтобы они "соседей" не "завалили"), но это покажу как-нибудь в другой серии постов.
Итак, наша задача - настройка Tomcat на работу с виртуальными хостами
С чего мы начнём? с базового задела Tomcat под поставленную задачу - со связки Nginx+Tomcat (помимо плюсов самого Nginx, нам не придётся думать об уровне доступа Tomcat для прослушки 80-го порта)
Настройка производится на сервере CentOS 5.5 (но думаю, что и на других версиях не будет отличий ;) ). Так же на сервере должен быть открыт 80-й порт
Устанавливаем nginx "по умолчанию":
# yum install nginx
создаём каталог /srv/nginx и меняем ему владельца и группу на nginx (в этом каталоге мы будем хранить настройки виртуальных хостов для nginx):
# mkdir -p /srv/nginx
# chown nginx:nginx /srv/nginx
правим файл /etc/nginx/conf.d/virtual.conf
# mv /etc/nginx/conf.d/virtual.conf /etc/nginx/conf.d/virtual.conf.orign
# echo "include /srv/nginx/vhost_*.conf;" > /etc/nginx/conf.d/virtual.conf
создаём файл /srv/nginx/proxy.conf со следующим содержимым:
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
это общие настройки для всех виртуальных хостов. В последующем можно будет дописать или поправить его содержимое.
создаём хост "по-умолчанию", для этого создаём файл /srv/nginx/vhost_00_default.conf:
server {
listen 80 default;
location / {
proxy_pass http://127.0.0.1:8080;
include /srv/nginx/proxy.conf;
}
}
Теперь переходим к базовой установке и настройке Tomcat
Скачиваем и распаковываем дистрибутив Apache Tomcat (повествую на примере версии 6.x)
# cd /srv
# wget http://www.sai.msu.su/apache/tomcat/tomcat-6/v6.0.29/bin/apache-tomcat-6.0.29.tar.gz
# tar xvf apache-tomcat-6.0.29.tar.gz
# mv apache-tomcat-6.0.29 tomcat
# useradd -d /srv/tomcat -s "/sbin/nologin" tomcat
для запуска демона Tomcat от пользователя tomcat можно скомпилировать jsvc, но мне больше нравится нижеприведённый скрипт /etc/init.d/tomcat6:
#!/bin/sh
#
# /etc/init.d/tomcat6
#
# This is the init script for starting up the
# Jakarta Tomcat Server
#
# chkconfig: 234 20 80
# description: Starts and stops the Tomcat daemon
# processname: tomcat
#
# source functions library for 'daemon' function
. /etc/init.d/functions
TOMCAT_HOME=/srv/tomcat
TOMCAT_START=$TOMCAT_HOME/bin/startup.sh
TOMCAT_STOP=$TOMCAT_HOME/bin/shutdown.sh
TOMCAT_USER=tomcat
start() {
echo -n $"Starting Tomcat service: "
daemon --user $TOMCAT_USER $TOMCAT_START RETURN_CODE=$?
echo $?
}
stop() {
echo -n $"Stopping Tomcat service: "
daemon --user $TOMCAT_USER $TOMCAT_STOP RETURN_CODE=$?
echo $?
}
status() {
ps aux | grep tomcat | grep -v grep
}
# Handle the different input options
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
*)
echo $"Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
Теперь переходим к небольшому "тюнингу" Tomcat, для дальнейшего удобства его администрирования
Для начала, поправим файл /srv/tomcat/conf/server.xml (далее просто server.xml) для работы с Nginx. Для этого найдём
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"redirectPort="8443" />
и заменим её на
<Connector address="127.0.0.1" port="8080" protocol="HTTP/1.1" connectionTimeout="20000"redirectPort="8443" />
тем самым мы укажем Tomcat, чтобы он слушал порт 8080 только локально
Перейдём к настройке хостов.
удобнее всего править настройки хостов не выискивая их в "портянке" файла server.xml, а вынеся настройки каждого хоста в отдельный файл. Для этого произведём некоторые изменения в файле server.xml
изменяем "шапку" файла, дописав блок DOCTYPE:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE server-xml [
<!ENTITY vhost-localhost SYSTEM "server.d/vhost-localhost.xml">
]>
создадим подкаталог server.d, в котором будут лежать конфигурационные файлы наших виртуальных хостов:
# cd /srv/tomcat/conf
# mkdir server.d
Вынесем в отдельный файл настройки для localhost... Для этого найдём в server.xml блок "<Host>...</Host>" и сохраним его в server.d/vhost-localhost.xml:
# cd /srv/tomcat/conf
# echo "<?xml version='1.0' encoding='utf-8'?>" > server.d/vhost-localhost.xml
# sed -n -e '/[[:space:]]*<Host.*/,/[[:space:]]<\/Host>/p' server.xml >> server.d/vhost-localhost.xml
# sed -i.bak -n '1h;1!H;${x;s/<Host.*<\/Host>/\&vhost-localhost;/;p}' server.xml
Для работы Tomcat требуется установленная на сервере Java-машина. Путь до неё прописывается в файле /srv/tomcat/bin/setenv.sh:
# echo "JAVA_HOME=/usr/java/default" > /srv/tomcat/bin/setenv.sh
Следующий наш шаг - настройка каталога webapps для будущих виртуальных каталогов
# cd /srv/tomcat
# sed -i 's/webapps/webapps\/localhost/' conf/server.d/vhost-localhost.xml
# mv webapps localhost
# mkdir webapps
# mv localhost webapps/
и заваршающее действие:
# chown -R tomcat:tomcat /srv/tomcat
Готово. теперь можно запускать созданный web-сервер:
# service tomcat6 start
# service nginx start
Зайдите в браузере по адресу http://ваш_сервер - вы должны увидеть Tomcat-страницу по-умолчанию.
Если всё правильно настроено и вы увидели страницу Tomcat, то можно установить автозапуск для демонов:
# chkconfig nginx on
# chkconfig --add tomcat6
# chkconfig tomcat6 on
ЗЫ: комментарии и замечания приветствуются :)
UPD: изменил немного скрипты - местами удалил "ручную" работу и описал для Tomcat 6 вместо Tomcat 7