суббота, 13 сентября 2008 г.

Установка Apache Tomcat

Apache Tomcat - программа-контейнер сервлетов, написанная на языке Java и реализующая спецификацию сервлетов и спецификацию JavaServer Pages (JSP), которые являются стандартами для разработки веб-приложений на языке Java.

Если вы попробуете скачать и распаковать Tomcat, а потом еще его и запустить командой каталог_tomcat/bin/catalina.sh run, то уверен на 99%, что у вас все прекрасно заработает и вы сможете открыть страничку по адресу http://имя_сервера:8080. Написано на java - работает везде! Сказано - сделано!

Интересности начинаются когда вы попробуете запустить tomcat на стандартном - 80 порту. Порты с номерами меньше 1024 являются в linux привилегированными, открывать их может только пользователь root. А запускать веб-сервер из-под root - это просто небезопасно.

Второй вопрос, который возникает - как запустить tomcat в качестве сервиса, т.е. чтобы он стартовал при старте системы.


Итак, пошаговая инструкция по установке Apache Tomcat:
  • Первое, что необходимо сделать это установить jdk, как это сделать написано здесь.

  • Затем, необходимо скачать последнюю версию Tomcat. На момент написания - это 6.0.18.

  • Лично я устанавливаю все приложения не входящие в репозиторий в каталог /opt(от слова optional). Поэтому распакуем скачанный файл и переместим туда каталог:
    tar xvzf apache-tomcat-6.0.18.tar.gz
    sudo mv apache-tomcat-6.0.18 /opt


    Создадим ссылку с именем /opt/apache-tomcat, для того, чтобы не переписывать скрипты при смене версии:
    sudo ln -s /opt/apache-tomcat-6.0.18 /opt/apache-tomcat

  • Cоздадим системного пользователя tomcat, под которым будет работать наш сервер:
    sudo adduser --system tomcat


    Сделаем хозяином каталога /opt/apache-tomcat пользователя tomcat:
    sudo chown -RLv tomcat:nogroup /opt/apache-tomcat

  • Проводим пробный запуск:
    sudo -u tomcat /opt/apache-tomcat/bin/catalina.sh run


    Открываем браузер по адресу http://имя_сервера:8080. Если все сделано правильно, то увидим следующую картину:


  • Теперь необходимо заставить сервер запускаться на стандартных портах. Для этого необходимо отредактировать файл /opt/apache-tomcat/conf/server.xml
    Ищем следующий текст:
    <connector port="8080" protocol="HTTP/1.1" connectiontimeout="20000" redirectport="8443"></connector>

    Меняем порт на стандартный для http - 80, и указываем кодировку для URI:
    <connector port="80" protocol="HTTP/1.1" connectiontimeout="20000" redirectport="8443" URIEncoding="UTF-8"></connector>

    Теперь при запуске сервера будет выходить ошибка доступа:
    java.net.BindException: Permission denied<null>:80
    at org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:502)
    at org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:176)
    at org.apache.catalina.connector.Connector.initialize(Connector.java:1058)
    at org.apache.catalina.core.StandardService.initialize(StandardService.java:677)
    at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:795)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:530)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:550)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:260)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:412)

    Как уже говорилось - порты с номерами меньше 1024 может открывать только пользователь root.

  • Для запуска сервера под пользователем tomcat на стандартном порту необходимо установить утилиту jsvc:
    sudo apt-get install jsvc -y


    JSVC - утилита предназначенная, чтобы запускать java-программы как сервисы(демоны) операционной системы.

    Далее в каталоге /etc/init.d создадим файл tomcat со следующим содержанием:
    #!/bin/sh
    JAVA_HOME=/usr/lib/jvm/java-6-sun
    CATALINA_HOME=/opt/apache-tomcat
    TOMCAT_USER=tomcat

    TMP_DIR=/var/tmp
    PID_FILE=/var/run/apache-tomcat.pid
    CATALINA_BASE=/opt/apache-tomcat

    CATALINA_OPTS="-Xmx1024m -Xms512m -XX:MaxPermSize=128m -Djava.awt.headless=true"
    CLASSPATH=\
    $JAVA_HOME/lib/tools.jar:\
    $CATALINA_HOME/bin/commons-daemon.jar:\
    $CATALINA_HOME/bin/tomcat-juli.jar:\
    $CATALINA_HOME/bin/bootstrap.jar

    case "$1" in
    start)
    #
    # Start Tomcat
    #
    jsvc \
    -user $TOMCAT_USER \
    -home $JAVA_HOME \
    -Dcatalina.home=$CATALINA_HOME \
    -Dcatalina.base=$CATALINA_BASE \
    -Djava.io.tmpdir=$TMP_DIR \
    -Dfile.encoding=UTF-8 \
    -Duser.timezone=Europe/Samara \
    -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
    -Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties \
    -wait 10 \
    -pidfile $PID_FILE \
    -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 \
    exit $?
    ;;

    stop)
    #
    # Stop Tomcat
    #
    jsvc \
    -stop \
    -pidfile $PID_FILE \
    org.apache.catalina.startup.Bootstrap
    exit $?
    ;;
    restart)
    #
    # Restart Tomcat
    #
    $0 stop
    sleep 2
    $0 start
    ;;
    *)
    echo "Usage tomcat start/stop"
    exit 1;;
    esac

    Или, скачайте его отсюда.

    Сделаем его исполняемым:
    sudo chown root:root /etc/init.d/tomcat
    sudo chmod 755 /etc/init.d/tomcat


    Для проверки работы запустим tomcat:
    sudo /etc/init.d/tomcat start


    Сервер должен запуститься на 80 порту. Для остановки используем следующую команду:
    sudo /etc/init.d/tomcat stop

  • Создадим ссылки на скрипт для автоматического запуска и останова:
    sudo update-rc.d tomcat defaults


    Перезагружаем сервер:
    sudo shutdown -r now


    Теперь tomcat будет запускаться автоматически.



2 комментария:

libc6 комментирует...

Спасибо большое. Работаид. Удивился даже, что в пакетах есть jsvc, не пришлось собирать всякими конфигурами, доволен.

Теперь думаю, стоит ли так же (через jsvc) запускать Derby...

Unknown комментирует...

libc6: В последних ubuntu tomcat ставиться из пакетов, стало все намного проще.