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

Опубликовано:

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-сервер, плюс ещё надцать других причин — стоит использовать варианты, предложенные мною выше, лишь соблюдая вопросы безопасности.

Понравилась статья, расскажи о ней друзьям, нажми кнопку!