Установка и конфигурация Tomcat 5.5 на ALT Linux Master 2.4
Каждый имеет
право воспроизводить, распространять и/или вносить изменения в
настоящий Документ в соответствии с условиями GNU Free Documentation
License, Версией 1.1 или любой более поздней версией, опубликованной
Free Software Foundation;
Данный документ не содержит
Неизменяемых разделов; данный документ содержит следующий Текст,
помещаемый на первой странице обложки: "Установка и конфигурирование
Tomcat 5.5 на ALT Linux Master 2.4", данный документ не содержит
Текста, помещаемого на последней странице обложки. Копия настоящей
Лицензии включена в раздел под названием "GNU Free Documentation
License".
- Установка tomcat 5.5
- Запуск сервера в качестве демона на 80 порту
- Настройка виртуальных хостов
- Включение режима записи access логов
- Подключение Webalizer
- Настройка logrotate
Установка tomcat 5.5
Загружаем архив
jakarta-tomcat-5.5.9.tar.gz с сайта разработчика http://jakarta.apache.org/tomcat.
Распаковываем полученный архив
# cd /usr/local
# mkdir tomcat
# cd tomcat
# tar -xzf /path/to/archives/jakarta-tomcat-5.5.9.tar.gz
# ln -s jakarta-tomcat-5.5.9 5.5
После распаковки архива создаем символьную ссылку которая позволит в дальнейшем, при установке другой версии сервера, избежать изменения путей в скриптах запуска. Для перехода на новую версию нужно будет только перенаправить эту ссылку на другую папку.
Tomcat версии 5.5 предназначен для работы с jdk 1.5. Загружаем jdk-1_5_0_02-linux-i586-rpm.bin с http://java.sun.com/ Устанавливаем полученный jdk # ./jdk-1_5_0_02-linux-i586-rpm.bin
[ принимаем лицензию и получаем rpm пакет ]
# rpm -ihv jdk-1_5_0_02-linux-i586-rpm
jdk #######################################################
Запуск сервера в качестве демона на 80 порту
Вопрос стоит или нет запускать tomcat на 80 порту часто вызывает дискуссии по поводу безопасности этого решения. Есть мнение, что более безопасно запустить apache на 80 порту, а tomcat оставить на порту 8080. В этом случае, tomcat подключается к apache с помощью mod_jk. Все запросы к web серверу принимает apache и перенапарвляет их на tomcat. Такая конфигурация главным образом используется когда одно web приложение использует и php и jsp/servlet. В случае, когда используется только java работа apache сводится только к перенаправлению запросов, кроме этого усложняется конфигурирование web сервера.
Для того, чтобы определиться, я задал этот вопрос в нескольких списках рассылки в результате чего сделал вывод о том, что запускать tomcat с помощью команды jsvc допустимо с точки зрения безопасности. Я не в коем случае не настаиваю на правильности моего решения, я всего лиш провел исследование которое удовлетворило лично меня. В качестве альтернативного варианта можно оставить tomcat на порту 8080 и подключить его к apache с помощью mod_jk или сделать перенаправление портов с помощью iptables.
Вот ссылки на письма в списках рассылки:
http://lists.altlinux.ru/pipermail/community/2005-March/thread.html
http://mail-archives.eu.apache.org/mod_mbox/jakarta-tomcat-user/200503.mbox/threads.html
Обсуждение этой темы на форуме http://www.javable.com/:
http://www.javable.com/forum/thread.jspa?threadID=11553
http://www.javable.com/forum/thread.jspa?threadID=11586
Порты с номерами меньшими 1024 являются привилегированными, поэтому чтобы запустить Tomcat на порту 80 нужно собрать программу jsvc которая запускает tomcat в качестве демона. Команда jsvc запускает два процесса: первый выполняется с правами root и открывает 80 порт, второй выполняется с правами $TOMCAT_USER он обслуживает пользовательские запросы к серверу.
Ссылки по этой теме:
http://www.klawitter.de/tomcat80.html
http://jakarta.apache.org/tomcat/tomcat-5.5-doc/setup.html
1. Собираем jsvc
# cd /usr/local/tomcat/5.5/bin
# tar -xzf jsvc.tar.gz
# cd jsvc-src
# autoconf
# chmod +x configure
# ./configure --with-java=/usr/java/jdk1.5.0_02
# make
# cp jsvc ..
2. Заводим пользователя tomcat5. С полномочиями этого пользователя будет работать tomcat.
# useradd -d /dev/null -s /dev/null -c 'Tomcat5 user' tomcat5
3. Пишем скрипт запуска. Заготовка скрипта запуска есть в каталоге jsvc-src/native
# cd /usr/local/tomcat/5.5/bin/jsvc-src/native
# cp Tomcat5.sh ../..
# vim /usr/local/tomcat/5.5/bin/Tomcat5.sh
# cat /usr/local/tomcat/5.5/bin/Tomcat5.sh
#!/bin/sh
#
# tomcat Start/Stop the Jakarta Tomcat
#
# chkconfig: 345 81 14
# description: Tomcat is the servlet container that is used \
# in the official Reference Implementation for the Java Servlet \
# and JavaServer Pages technologies. The Java Servlet and JavaServer Pages \
# specifications are developed by Sun under the Java Community Process.
#
# processname: jsvc
# pidfile: /var/run/jsvc.pid
# config: /usr/local/tomcat/5.5/conf/server.xml
#
##############################################################################
#
# Copyright 2004 The Apache Software Foundation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##############################################################################
#
# Small shell script to show how to start/stop Tomcat using jsvc
# If you want to have Tomcat running on port 80 please modify the server.xml
# file:
#
# <!-- Define a non-SSL HTTP/1.1 Connector on port 80 -->
# <Connector className="org.apache.catalina.connector.http.HttpConnector"
# port="80" minProcessors="5" maxProcessors="75"
# enableLookups="true" redirectPort="8443"
# acceptCount="10" debug="0" connectionTimeout="60000"/>
#
# That is for Tomcat-5.0.x (Apache Tomcat/5.0)
#
# Adapt the following lines to your configuration
JAVA_HOME=/usr/java/jdk1.5.0_02
CATALINA_HOME=/usr/local/tomcat/5.5
DAEMON_HOME=/usr/local/tomcat/5.5/bin
TOMCAT_USER=tomcat5
TMP_DIR=/var/tmp
CATALINA_OPTS=
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar
case "$1" in
start)
#
# Start Tomcat
#
echo -n "Tomcat starting ... "
chown -R tomcat5:tomcat5 /usr/local/tomcat/5.5/*
$DAEMON_HOME/jsvc \
-user $TOMCAT_USER \
-home $JAVA_HOME \
-Dcatalina.home=$CATALINA_HOME \
-Djava.io.tmpdir=$TMP_DIR \
-outfile $CATALINA_HOME/logs/catalina.out \
-errfile '&1' \
$CATALINA_OPTS \
-cp $CLASSPATH \
org.apache.catalina.startup.Bootstrap
#
# To get a verbose JVM
#-verbose \
# To get a debug of jsvc.
#-debug \
;;
stop)
#
# Stop Tomcat
#
echo -n "Tomcat shutting ... "
PID=`cat /var/run/jsvc.pid`
kill $PID
;;
status)
echo "Tomcat processes: "
ps aux --cols 1024 | grep org.apache.catalina.startup.Bootstrap | grep -v grep
;;
restart|reload)
$0 stop
$0 start
exit 0
;;
*)
echo "Usage: $0 {start|stop|status|restart|reload}"
exit 1
;;
esac
echo " [ DONE ]"
exit 0
4. Размещаем ссылку на скрипт запуска в /etc/rc.d/init.d
# cd /etc/rc.d/init.d
# ln -s /usr/local/tomcat/5.5/bin/Tomcat5.sh tomcat
5. Меняем порт в server.xml с 8080 на 80
# vim /usr/local/tomcat/5.5/conf/server.xml
# cat /usr/local/tomcat/5.5/conf/server.xml
. . .
<Connector port="80"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
. . .
Если на компьютере запущен apache то необходимо перевести его на другой порт, например 8080 и перезапустить.
# vim /etc/httpd/conf/httpd.conf
# cat /etc/httpd/conf/httpd.conf
. . .
Listen 8080
. . .
# service httpd restart
Stopping httpd service: [ DONE ]
Checking configuration sanity for httpd: [ DONE ]
Starting httpd service: [ DONE ]
6. Подключаем tomcat к стартовым скриптам SystemV и запускаем сервер
# chkconfig --add tomcat
# chkconfig --list | grep tomcat
tomcat 0:off 1:off 2:off 3:on 4:on 5:on 6:off
# service tomcat start
Tomcat starting ... [ DONE ]
7. Чтобы убедиться в том, что tomcat загрузится после перезагрузки системы выполняем перезагрузку.
# reboot
У меня все загрузилось нормально.
Настройка виртуальных хостов
Если сервер будет обслуживать несколько доменов и на каждом домене будет свое web приложение, то нужно настроить виртуальные хосты.
1. Редактируем конфигурационный файл server.xml. Добавляем xml блоки Host в блок Engine для каждого имени которое будет использоваться в URL.
# vim /usr/local/tomcat/5.5/conf/server.xml
# cat /usr/local/tomcat/5.5/conf/server.xml
. . .
<Host name="www.mydomain1.org" appBase="webapps">
<Context
path=""
docBase="app1"
reloadable="true"
/>
</Host>
<Host name="mydomain1.org" appBase="webapps">
<Context
path=""
docBase="app1"
reloadable="true"
/>
</Host>
<Host name="www.mydomain2.org" appBase="webapps">
<Context
path=""
docBase="app2"
reloadable="true"
/>
</Host>
<Host name="mydomain2.org" appBase="webapps">
<Context
path=""
docBase="app2"
reloadable="true"
/>
</Host>
</Engine>
. . .
Здесь:
Host name="www.mydomain1.org" - имя web приложения;
Context path="/webapp" - продолжение имени ресурса (www.mydomain1.org/webapp);
Context docBase="app1" - директория внутри webapps в которой находится web приложение.
2. Размещаем web приложения в директориях указанных в server.xml и перезапускаем tomcat.
# service tomcat restart
Tomcat shutting ... [ DONE ]
Tomcat starting ... [ DONE ]
Включение режима записи access логов
По умолчанию tomcat не пишет access логи, но эту функцию можно включить.
1. Создаем директорию для tomcat в /var/log и ставим ссылку на нее из директории logs в директории установки tomcat
Если нам нужно вести логи отдельно для каждого виртуального домена, то создаем поддиректории в /var/log/tomcat соответствующие именам наших доменов.
# cd /var/log
# mkdir -p tomcat/mydomain1
# mkdir -p tomcat/mydomain2
# chown -R tomcat5:tomcat5 tomcat
# cd /usr/local/tomcat/5.5/logs
# ln -s /var/log/tomcat access
2. Для активации режима ведения access лога нужно определить соответствующий xml блок Valve в server.xml
Нужно задать один из Valve блоков:
Valve className="org.apache.catalina.valves.AccessLogValve"
Valve className="org.apache.catalina.valves.FastCommonAccessLogValve"
Valve className="org.apache.catalina.valves.ByteBufferAccessLogValve"
Такой блок нужно задать внутри блока Context, Host, или Engine
задавая тем самым уровень на котором будет вестись запись логов.
Ссылка по этой теме:
http://localhost/tomcat-docs/config/valve.html
ссылка на localhost так как сервер уже работает, а в его комплект входит документация.
В следующем примере я включаю режим ведения access лога для виртуального хоста www.mydomain1.org.
# vim /usr/local/tomcat/5.5/conf/server.xml
# cat /usr/local/tomcat/5.5/conf/server.xml
. . .
<Host name="www.mydomain1.org" appBase="webapps">
. . .
<Valve className="org.apache.catalina.valves.FastCommonAccessLogValve"
directory="logs/access/mydomain1" prefix="access" suffix=".log"
pattern="combined" resolveHosts="true"/>
</Host>
. . .
3. Для активации режима ведения логов перезапускаем tomcat
# service tomcat restart
Tomcat shutting ... [ DONE ]
Tomcat starting ... [ DONE ]
Подключение Webalizer
Для ведения статистики посещения web приложений с помощью анализа access.log подключим Webalizer.
1. Устанавливаем пакет webalizer
# apt-get install webalizer
. . .
2. Создаем конфигурационные файлы для каждого виртуального хоста
# cd /etc/webalizer
# cp apache.conf mydomain1.conf
# cp apache.conf mydomain2.conf
3. Редактируем созданные конфигурационные файлы. Я переопределил и добавил следующие строки:
# cat mydomain1.conf | grep ^[^#]
LogFile /var/log/tomcat/mydomain1/access_log
LogType clf
OutputDir /var/www/html/webalizer/mydomain1
HistoryName /var/lib/webalizer/mydomain1/webalizer.hist
Incremental yes
IncrementalName /var/lib/webalizer/mydomain1/webalizer.current
ReportTitle Usage Statistics for
HostName www.mydomain1.ru
. . .
PageType jsp
DNSCache /var/lib/webalizer/mydomain1/dns_cache.db
. . .
Для вывода информации я использую www директорию apache, который у меня запущен на порту 8080. Если apache не установлен можно направить вывод webalizer в директорию /usr/local/tomcat/5.5/webapps/mydomain1. Для работы такого web приложения под tomcat нужно написать простейший WEB-INF/web.xml файл.
4. Создаем необходимые директории для webalizer
# cd /var/lib/webalizer
# mkdir mydomain1
# mkdir mydomain2
# chown webalizer:webalizer mydomain1
# chown webalizer:webalizer mydomain2
# cd /var/www/html
# mkdir -p webalizer/mydomain1
# mkdir -p webalizer/mydomain2
# chgrp -R webalizer webalizer/
# chmod -R 775 webalizer/
5. Перенаправляем данные содержащиеся в access логах tomcat в файл access_log. Поскольку tomcat пишет логи в формате accessYYYY-MM-DD.log то для того, чтобы webalizer имел возможность работать с одним файлом пишем скрипт который перенаправляет содержимое лога в файл с постоянным именем.
# vim /usr/local/sbin/tomcat_logs_mover
# cat /usr/local/sbin/tomcat_logs_mover
#!/bin/bash
#
#
# Logs Mover for Tomcat Server
#
# To correct use this command need specify
# path to logs files in the first parameter.
#
if [ -n "$1" ]
then
cd $1
LOGFN=log_file_name
if [ -s $LOGFN ]
then
LOGFILE=`cat $LOGFN`
if [ -s $LOGFILE ]
then
cat $LOGFILE >> access_log
rm -f $LOGFILE
fi
echo -n 'access'`date +%Y"-"%m"-"%d`'.log' > $LOGFN
exit 0
else
echo Error: File $LOGFN not found
exit 1
fi
else
echo Error: Not specified path to logs
exit 1
fi
Этот скрипт необходимо запускать с параметром который задает путь до директории в которой находятся логи tomcat.
6. Создаем файл хранящий имя текущего файла лога
# cd /var/log/tomcat
# echo -n 'access'`date +%Y"-"%m"-"%d`'.log' > mydomain1/log_file_name
# echo -n 'access'`date +%Y"-"%m"-"%d`'.log' > mydomain2/log_file_name
2. Задаем время запуска скрипта и webalizer с помощью cron
# crontab -e
# crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.T2FfUJ installed on Fri Apr 1 14:29:42 2005)
# (Cron version V5.0 -- vixie-cron-4.0.b1.20040604-alt2)
#minute (0-59),
#| hour (0-23),
#| | day of the month (1-31),
#| | | month of the year (1-12),
#| | | | day of the week (0-6 with 0=Sunday).
#| | | | | commands
#| | | | | |
1 0 * * * /usr/local/sbin/tomcat_logs_mover /var/log/tomcat/mydomain1
1 0 * * * /usr/local/sbin/tomcat_logs_mover /var/log/tomcat/mydomain2
3 0 * * * /usr/bin/webalizer -c /etc/webalizer/mydomain1.conf >/dev/null 2>/dev/null
3 0 * * * /usr/bin/webalizer -c /etc/webalizer/mydomain2.conf >/dev/null 2>/dev/null
Таким образом, в 0:01 запускается скрипт перенапрвляющий данные в access_log, а в 0:03 запускается webalizer который обрабатывает этот лог.
После того как webalizer сгенерировал статистику ее можно посмотреть по следующим URL:
http://www.mydomain1.ru:8080/webilizer/mydomain1
http://www.mydomain1.ru:8080/webilizer/mydomain2
Настройка logrotate
Для того, чтобы не происходил процесс бесконечного роста лог файлов настраиваем logrotate.
1. Создаем конфигурационный файл в /etc/logrotate.d
# cd /etc/logrotate.d
# echo '/var/log/tomcat/mydomain1/access_log {
missingok
notifempty
}
/var/log/tomcat/mydomain1/access_log {
missingok
notifempty
}' > tomcat
По умолчанию, logrotate запускается раз в неделю около четырех часов утра в воскресенье. В нашем случае, важно только то, чтобы webalizer обработал лог до того как его заархивирует logrotate. У меня webalizer запускается в 0:03, а logrotate в 4:02.
Глобальные настройки logrotate настраиваются в конфигурационном файле /etc/logrotate.conf.
GNU Free Documentation License
Текст GFDL на английском языке вы можете прочитать здесь http://www.gnu.org/copyleft/fdl.html
Текст перевода на русский язык лицензии GNU на свободную документацию вы можете прочитать здесь http://www.infolex.narod.ru/gpl_gnu/gfdlrus.html
Июнь 2005