© Юрий Левыкин, 2005.
Каждый имеет право воспроизводить, распространять и/или вносить изменения в настоящий Документ в соответствии с условиями GNU Free Documentation License, Версией 1.1 или любой более поздней версией, опубликованной Free Software Foundation;
Данный документ не содержит Неизменяемых разделов; данный документ содержит следующий Текст, помещаемый на первой странице обложки: "Установка и конфигурирование Tomcat 5.5 на ALT Linux Master 2.4", данный документ не содержит Текста, помещаемого на последней странице обложки. Копия настоящей Лицензии включена в раздел под названием "GNU Free Documentation License".
Загружаем архив 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-1_5_0_02-linux-i586-rpm.bin
 [ принимаем лицензию и получаем rpm пакет ]
 # rpm -ihv jdk-1_5_0_02-linux-i586-rpm
 jdk #######################################################
    
    Вопрос стоит или нет запускать 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.
Вот ссылки на письма в списках рассылки:
     community@altlinux.ru - http://lists.altlinux.ru/pipermail/community/2005-March/thread.html тема: "tomcat5 -- 80 port"
     tomcat-user@jakarta.apache.org - http://mail-archives.eu.apache.org/mod_mbox/jakarta-tomcat-user/200503.mbox/threads.html тема: "Tomcat -- port 80 for Linux"
  
Обсуждение этой темы на форуме 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
  
 # 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 ..
    
    С полномочиями этого пользователя будет работать tomcat.
 # useradd -d /dev/null -s /dev/null -c 'Tomcat5 user' tomcat5
    
    Заготовка скрипта запуска есть в каталоге 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
    
    
 # cd /etc/rc.d/init.d
 # ln -s /usr/local/tomcat/5.5/bin/Tomcat5.sh tomcat
    
    
 # 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 ]
    
    
 # 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 ]
    
    Чтобы убедиться в том, что tomcat загрузится после перезагрузки системы выполняем перезагрузку.
 # reboot
    
    У меня все загрузилось нормально.
Если сервер будет обслуживать несколько доменов и на каждом домене будет свое web приложение, то нужно настроить виртуальные хосты.
Добавляем 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 приложение.
    
 # service tomcat restart
Tomcat shutting ...     [ DONE ]
Tomcat starting ...     [ DONE ]
    
  По умолчанию tomcat не пишет access логи, но эту функцию можно включить.
Если нам нужно вести логи отдельно для каждого виртуального домена, то создаем поддиректории в /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
    
    Нужно задать один из 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>
  . . .
    
    
 # service tomcat restart
Tomcat shutting ...     [ DONE ]
Tomcat starting ...     [ DONE ]
    
  Для ведения статистики посещения web приложений с помощью анализа access.log подключим Webalizer.
# apt-get install webalizer . . .
 # cd /etc/webalizer
 # cp apache.conf mydomain1.conf
 # cp apache.conf mydomain2.conf
    
    Я переопределил и добавил следующие строки:
 # 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 файл.
 # 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/
    
    Поскольку 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.
 # 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
    
    
 # 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.
 # 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.
Текст GFDL на английском языке вы можете прочитать здесь http://www.gnu.org/copyleft/fdl.html
     Текст перевода на русский язык лицензии GNU на свободную документацию вы можете прочитать здесь http://www.infolex.narod.ru/gpl_gnu/gfdlrus.html
  
| 
 | 
 Юрий Левыкин, 16.05.2005   
 |