HOWTO: Установка Tomcat (Apache) на Debian (Ubuntu)
Apache Tomcat — популярный сервер для java-приложений. Сам также написан на Java, а потому требуется, чтобы она была уже установлена в системе (см. установка Java в Debian). Начиная с 2011-го года версия Tomcat 6 перешла в разряд устаревших, а потому на момент написания статьи наиболее актуален Tomcat 7, хотя с 2013-го года присутствует и даже работает Tomcat 8. Потому рассмотрим установку седьмой и восьмой версий:
- Установка Tomcat 7
- Установка Tomcat 8
- Безопасность Tomcat в линуксе
Установка Tomcat 7 для Debian 7
Несмотря на то, что Tomcat можно установить с помощью apt-get:
apt-get install tomcat7
Я обычно не пользуюсь таким «автоматическим» способом — тот нечастый случай, когда ставлю «вручную». Всё из-за выявленных многочисленных проблем с различными системами, которые встретились в моей практике. И хотя многое можно в конце концов «докрутить» и «донастроить» — весь такой «головняк» ни к чему. Особенно раз вы читаете эти строки — вряд ли сможете отнести себя к гуру линуксов. Да и к тому же уж сильно отстаёт версия в «стабильной» ветке Debian от доступной на официальной странице https://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 <start|stop|restart>»; exit 1;;
- esac
Полоской выделены изменения — добавили запуск из-под юзера tomcat (если у вас другой — прописываем его в TOMCAT_USER).
Строго аналогично для Tomcat 8.
Небольшое итого. Запуск Tomcat не из-под рута — идеологически правильный. Однако если нет достаточного опыта, вы запускаете не давно откатанные релизные пакеты, у вас на одном сервере крутится ещё и апач-вебсервер и ещё всякого и вам приходится для всего этого настраивать и ftp-сервер, плюс ещё надцать других причин — стоит использовать варианты, предложенные мною выше, лишь соблюдая вопросы безопасности.