HOWTO: Установка Tomcat (Apache) на Debian (Ubuntu)

Установка Tomcat на Debian

Apache Tomcat - популярный сервер для java-приложений. Сам также написан на Java, а потому требуется, чтобы она была уже установлена в системе (см. установка Java в Debian). Начиная с 2011-го года версия Tomcat 6 перешла в разряд устаревших, а потому на момент написания статьи наиболее актуален Tomcat 7, хотя с 2013-го года присутствует и даже работает Tomcat 8. Потому рассмотрим установку седьмой и восьмой версий:

Установка Tomcat 7 для Debian 7

Несмотря на то, что Tomcat можно установить с помощью apt-get:

apt-get install tomcat7

Я обычно не пользуюсь таким "автоматическим" способом - тот нечастый случай, когда ставлю "вручную". Всё из-за выявленных многочисленных проблем с различными системами, которые встретились в моей практике. И хотя многое можно в конце концов "докрутить" и "донастроить" - весь такой "головняк" ни к чему. Особенно раз вы читаете эти строки - вряд ли сможете отнести себя к гуру линуксов. Да и к тому же уж сильно отстаёт версия в "стабильной" ветке Debian от доступной на официальной странице http://tomcat.apache.org.

Конкретный пример — прямо на текущий момент через apt-get в Debian 7 Wheezy (main) получите версию Tomcat 7.28, на сайте лежит Tomcat 7.55, а различные пакеты могут грозно предупреждать, что не рекомендуют пользоваться версией Томката ниже 7.30.

Потому опишу "ручной" вариант. Первым делом идём на сайт и копируем ссылку на последнюю версию Tomcat7 (см. картинку в начале статьи).

По умолчанию сработает автодетект вашего расположения, потому если это делается для удалённого сервера, можно вручную указать US/EU - см. стрелки (для увеличения - нажмите на картинку).

Нехитрый список действий для текущей версии Томкат 7.55 будет:

  • wget http://www.us.apache.org/dist/tomcat/tomcat-7/v7.0.56/bin/apache-tomcat-7.0.56.tar.gz -O tomcat7.tar.gz
  • tar -xvf tomcat7.tar.gz
  • mv apache-tomcat-* /opt/tomcat7

Для версии на момент прочтения вами данной статьи - замените выделенную полоской ссылку или даже просто выделенные цифры версии.

Конкретный пример вышеуказанных действий:

root@debian7:/install/setup# wget http://www.us.apache.org/dist/tomcat/tomcat-7/v7.0.56/bin/apache-tomcat-7.0.56.tar.gz -O tomcat7.tar.gz
--2014-08-01 13:01:31--  http://www.us.apache.org/dist/tomcat/tomcat-7/v7.0.56/bin/apache-tomcat-7.0.56.tar.gz
Resolving www.us.apache.org (www.us.apache.org)... 140.211.11.131
Connecting to www.us.apache.org (www.us.apache.org)|140.211.11.131|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 8941662 (8.5M) [application/x-gzip]

Saving to: `tomcat7.tar.gz'
100%[==========================================================>] 8,941,662   2.92M/s   in 2.9s
2014-08-01 13:01:34 (2.92 MB/s) - `tomcat7.tar.gz' saved [8941662/8941662]

root@debian7:/install/setup# tar -xvf tomcat7.tar.gz
apache-tomcat-7.0.56/bin/catalina.sh
apache-tomcat-7.0.56/bin/configtest.sh
...
apache-tomcat-7.0.56/webapps/manager/status.xsd
apache-tomcat-7.0.56/webapps/manager/xform.xsl

root@debian7:/install/setup# mv apache-tomcat-* /opt/tomcat7
root@debian7:/install/setup#

У меня Tomcat будет установлен в /opt/tomcat7 (вы можете выбрать любое другое место). Чтобы ПО, требующее Tomcat, "знало" про данный каталог - нужно добавить переменную окружения CATALINA_HOME, указывающую на него ("Catalina" - имя древних версий Tomcat). Для этого (аналогично тому, как для Java в Linux) прописываем в .bashrc файле юзера, из-под которого будут запускаться java-приложения:

export CATALINA_HOME=/opt/tomcat7

Ещё раз - вместо /opt/tomcat7, если у вас это будет другое расположение - прописываем именно своё.

Перезагружаемся или перелогиниваемся нужным юзером и радуемся.

Только стоит помнить, что если в процессе отработки вы используете sudo - запускаете нужное из-под рута - то для пользователя root также (или вообще только для него) нужно прописать данную переменную (равно как JAVA_HOME и/или другие). Иначе будете удивляться ошибкам, думая, что вроде всё прописали, а запускаемое не может этого найти.

Теперь нужно запустить сам Tomcat-сервер. Для этого создаём скрипт запуска. Сделаем файл tomcat7 в /etc/init.d:

nano /etc/init.d/tomcat7

Либо другим привычным вам редактором - со следующим содержанием:

  • #!/bin/bash
  • export CATALINA_HOME=/opt/tomcat7
  • export JAVA_OPTS="-Xms1024M -Xmx1024M -Dfile.encoding=UTF-8";
  • PATH=/sbin:/bin:/usr/sbin:/usr/bin
  • start() {
  •  sh $CATALINA_HOME/bin/startup.sh
  • }
  • stop() {
  •  sh $CATALINA_HOME/bin/shutdown.sh
  • }
  • case $1 in
  •   start|stop) $1;;
  •   restart) stop; start;;
  •   *) echo "Run as $0 <start|stop|restart>"; exit 1;;
  • esac

Аналогично ранее сказанному - в случае отличия указываем свой каталог (CATALINA_HOME). А также java-опции (JAVA_OPTS), если нужно - у меня стоит популярный вариант ("-Xms1024M -Xmx1024M").

При выходе обзываем tomcat7 (или по желанию) и даём права на запуск:

chmod 755 /etc/init.d/tomcat7

Теперь можно запустить Томкат-сервер:

/etc/init.d/tomcat7 start

Для остановки используем команду stop:

/etc/init.d/tomcat7 stop

А для перезапуска restart (в реальности она выполняет последовательно стоп-старт):

/etc/init.d/tomcat7 restart

Для автостарта после перезагрузки можно просто добавить в rc.local:

nano /etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/etc/init.d/tomcat7 start

exit 0

Установка Tomcat 8 в Linux (Debian/Ubuntu)

Отличия установки Томкета 8 от седьмой версии практически нет. Лишь с поправкой на то, что на момент написания статьи она (восьмая версия) пока находится в бете. Итого, кратенько, пошаговая инструкция по установке Tomcat8 (плюс некоторые полезные команды):

  • wget http://www.us.apache.org/dist/tomcat/tomcat-8/v8.0.14/bin/apache-tomcat-8.0.14.tar.gz -O tomcat8.tar.gz
  • tar -xvf tomcat8.tar.gz
  • mv apache-tomcat-* /opt/tomcat8
  •  
  • nano /home/serveradmin/.bashrc
    • export CATALINA_HOME=/opt/tomcat8
  •  
  • nano /etc/init.d/tomcat8
    • #!/bin/bash
    • export CATALINA_HOME=/opt/tomcat8
    • export JAVA_OPTS="-Xms1024M -Xmx1024M -Dfile.encoding=UTF-8";
    • PATH=/sbin:/bin:/usr/sbin:/usr/bin
    • start() {
    •  sh $CATALINA_HOME/bin/startup.sh
    • }
    • stop() {
    •  sh $CATALINA_HOME/bin/shutdown.sh
    • }
    • case $1 in
    •   start|stop) $1;;
    •   restart) stop; start;;
    •   *) echo "Run as $0 <start|stop|restart>"; exit 1;;
    • esac
  •  
  • chmod 755 /etc/init.d/tomcat8
  • /etc/init.d/tomcat8 start
  •  
    • /etc/init.d/tomcat8 restart
    • /etc/init.d/tomcat8 stop
  •  
  • nano /etc/rc.local
    • /etc/init.d/tomcat8 start

Надеюсь, всё выше понятно, если что - спрашивайте в комментариях ниже.

Безопасность Tomcat в Linux

Нужно упомянуть про несколько очень важных моментов по безопасности при работе с Tomcat. Рассмотренные выше "ручные" варианты подразумевают обычно запуск из-под root-пользователя. В результате, если вы ещё и стандартно в файле, задающем пользователей (/opt/tomcat7/conf/tomcat-users.xml) раскомментируете блок оных:

  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>

...или воспользуетесь распространёнными в интернете примерами получения админских прав типа:

<role rolename="manager"/>
<role rolename="admin"/>
<user username="admin" password="admin" roles="admin,manager"/>

...или типа:

<role rolename="tomcat"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="tomcat" roles="tomcat, manager-gui, manager-script"/>

То знайте - ваша система становится крайне уязвимой, особенно, если это виртуалка на каком-либо "публичном" сервисе типа Amazon AWS EC2. Дело в том, что заводчики ботнетов тоже хорошо знают про такие "криптостойкие пароли" и в упомянутом случае Амазона сразу после поднятия Томкета начинается подбор вышеупомянутых логинов-паролей с целью получения доступа к вашей виртуалке. Установив-запустив Tomcat из-под рута вы даёте взломщику ключ от всей вашей системы - в неё очень быстро попадёт какой-нибудь враждебный скрипт, пожирающий впоследствии производительность (а значит и ваши деньги), обычно для подбора паролей и взлома других "соседей" и таких же неосторожных администраторов.

Итого, совет: если вам реально не нужны пользователи - не включайте их просто. Если включаете, то только с серьёзными паролями (и это не "admin123").

 

 

 


Послесловие. Далее много умных букв, читать и следовать которым нужно лишь, если вы не пользуетесь простой и понятной (и "менее проблемной", правда не с точки зрения безопасности) плюс, я бы сказал, "рабочекрестьянской" версией запуска Tomcat. Почему вам это нужно - другой вопрос. Ниже информация больше для поиска ошибки - почему у вас что-то не работает, если вы стараетесь делать всё "правильно".


User/group tomcat7

Нужно сказать, что в случае "автоматической" установки (через apt-get), Tomcat 7 ставится от имени пользователя tomcat7 и группы tomcat7. Потому и проблем с безопасностью при таком варианте нет. Однако в таком разе придётся всегда учитывать это отличие и не забывать на информацию, которая должна быть доступна для Tomcat, ставить права tomcat7 (ниже условный пример):

chown -R tomcat7:tomcat7 /var/www

В принципе, аналогичное (запуск Tomcat не из-под рута) можно сделать и для "ручного" варианта. Т.е. создать томкет группу и пользователя, домашней директорией сделать каталог, куда поставили Tomcat, объединить для удобства (и применения других привычных для apcahe-вебсервера вещей) группы www-data и созданную tomcat, а после давать права tomcat:tomcat на нужные для работы папки.

Замечание: для удобности не буду добавлять цифру в конце (как это в случае "автоматической установки" через apt-get), т.е. юзер/группа не tomcat7 и/или tomcat8, а просто tomcat - чтобы один и тот же скрипт был одинаково применим для любой версии Tomcat.

Короткий конкретный мануал для каждого:

Для Tomcat 7:

  • groupadd tomcat
  • useradd -g tomcat -d /opt/tomcat7 tomcat
  • usermod -G www-data tomcat
  • chown -R tomcat:tomcat /opt/tomcat7

Для Tomcat 8 аналогично:

  • groupadd tomcat
  • useradd -g tomcat -d /opt/tomcat8 tomcat
  • usermod -G www-data tomcat
  • chown -R tomcat:tomcat /opt/tomcat8

Замечание: аналогично предыдущему замечанию, если раздражает, действительно, некоторая путаница tomcat-tomcat7-tomcat8 — используйте без цифры в конце (просто tomcat). Здесь же (с цифрами) я использую лишь для того, чтобы показать, что и седьмая и восьмая версии ставятся одинаково плюс привык и бывает приходится использовать два варианта Tomcat (и семёрку и восьмёрку) на одном сервере (всё же Tomcat 8 пока - на момент написания статьи - в бете).

Теперь для запуска "вручную" можно "переключиться" на пользователя tomcat:

su - tomcat

И запустить ранее созданный скрипт (/etc/init.d/tomcat7 или /etc/init.d/tomcat8). Однако для этого у пользователя tomcat должны быть на это права, потому предварительно придётся сделать:

chown tomcat:tomcat /etc/init.d/tomcat7

Т.к. по умолчанию у данного скрипта, созданного из-под рута - права на запуск лишь от root.

Можно и без подобных телодвижений, просто перейти в папку установленного Томкета (которой мы уже делели chown tomcat:tomcat) и запустить скрипт старта:

tomcat@debian7:/linux.cmd/setup# cd /opt/tomcat7/bin
tomcat@debian7:/opt/tomcat7/bin# ./startup.sh

Важно: При переключении на нового пользователя никогда не нужно забывать, что и переменные окружения (JAVA_HOME, CATALINA_HOME и т.д) для него также будут свои (а точней - отсутствовать), т.е., например, их нужно напрямую задавать в запускаемых скриптах.

Для запуска из-под рута скрипта, который бы запускал Tomcat из-под пользователя tomcat, придётся модифицировать ранее созданный скрипт /etc/init.d/tomcat7:

  • #!/bin/bash
  • export CATALINA_HOME=/opt/tomcat7
  • export JAVA_OPTS="-Xms1024M -Xmx1024M -Dfile.encoding=UTF-8";
  • export TOMCAT_USER=tomcat;
  • PATH=/sbin:/bin:/usr/sbin:/usr/bin
  • start() {
  •  su $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh
  • }
  • stop() {
  •  su $TOMCAT_USER -c $CATALINA_HOME/bin/shutdown.sh
  • }
  • case $1 in
  •   start|stop) $1;;
  •   restart) stop; start;;
  •   *) echo "Run as $0 &lt;start|stop|restart&gt;"; exit 1;;
  • esac

Полоской выделены изменения - добавили запуск из-под юзера tomcat (если у вас другой - прописываем его в TOMCAT_USER).

Строго аналогично для Tomcat 8.

Небольшое итого. Запуск Tomcat не из-под рута - идеологически правильный. Однако если нет достаточного опыта, вы запускаете не давно откатанные релизные пакеты, у вас на одном сервере крутится ещё и апач-вебсервер и ещё всякого и вам приходится для всего этого настраивать и ftp-сервер, плюс ещё надцать других причин - стоит использовать варианты, предложенные мною выше, лишь соблюдая вопросы безопасности.

 

p.s. Для удобства обновил версии на текущие (на октябрь 2014) 7.0.55 ->7.0.56 и 8.0.5->8.0.14.

Если вам помогла или просто понравилась статья - плюсаните/поделитесь, пожалуйста.

Комментарии

Что-то непонятно: fix

chown tomcat7:tomcat7 /etc/init.d/tomcat7

А до этого:

groupadd tomcat
◾ useradd -g tomcat -d /opt/tomcat7 tomcat
◾ usermod -G www-data tomcat
◾ chown -R tomcat:tomcat /opt/tomcat7

Спасибо, за статью.

 

Вопрос, видимо, про то, скрипт запуска/остановки/перезапуска /etc/init.d/tomcat7. Мы его создавали в редакторе из-под рута, потому и запустить его может лишь юзер с правами root. Из-под юзера tomcat, в описываемом внизу статьи "продвинуто-правильном" случае, соответственно, это не получится. Для этого и даём ему (tomcat-юзеру) право на работу с данным скриптом, ведь иначе

su $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh

не отработает.

Поправочка, вы правы, только сейчас заметил ошибочку, вместо

chown tomcat7:tomcat7 /etc/init.d/tomcat7

должно быть

chown tomcat:tomcat /etc/init.d/tomcat7

Исправил в статье, спасибо!

 

Добавить комментарий