Оптимизация Tomcat на сервере Ubuntu 14.04

Tomcat – это популярный сервер приложений, реализация технологий Java Servlet и JavaServer Pages. Разработан компанией Apache Software и распространяется согласно открытой лицензии Apache. Благодаря своей производительности, удобному набору функций, популярной лицензии и активному сообществу Tomcat  является одной из лучших и наиболее популярных реализаций Java Servlet.

После установки Tomcat почти всегда нуждается в дополнительной тонкой настройке. Это руководство поможет оптимизировать Tomcat, а также повысив его безопасность и производительность.

Примечание: Данное руководство является продолжением статьи «Установка Apache Tomcat 7 в Ubuntu 14.04», потому подразумевается, что Apache Tomcat уже установлен.

Требования

  • Настроенный сервер Ubuntu 14.04.
  • Не-root пользователь с доступом к sudo (об этом можно прочитать здесь).
  • Предварительно установленный сервер Apache Tomcat (согласно данному руководству).

Все команды руководства нужно выполнять с правами sudo.

Обслуживание запросов на стандартном порте HTTP

Обратите внимание: по умолчанию сервер Tomcat слушает запросы TCP на порте 8080. Этот порт используется потому, что Tomcat работает через учётную запись tomcat7, у которой нет привилегий. В системах Linux только пользователи с привилегиями root могут слушать порты ниже 1024. Чтобы открыть доступ к этим портам для непривилегированных пользователей, нужно выполнить дополнительную настройку системы. То есть, просто так изменить порт Tomcat на 80 (HTTP) не получится.

Итак, первая настройка Tomcat, которую нужно оптимизировать, – это порт. Все веб-приложения Tomcat должны быть доступны на стандартном порте HTTP.

Самый простой (хотя, возможно, не лучший) способ сделать это – создать правило iptables, перенаправляющее запросы с TCP-порта 80 на порт 8080. Для этого используйте команду:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

Примечание: Чтобы узнать, как сделать это правило iptables постоянным, читайте статью «Настройка IPTables на Ubuntu 14.04».

Чтобы удалить это правило, просто замените флаг –А (добавляющий правило) флагом -D :

sudo iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

Такая простая переадресация трафика не является оптимальным способом решения этой проблемы (с точки зрения безопасности и производительности). Вместо этого лучше добавить веб-сервер, (например, Nginx). Дело в том, что Tomcat – это просто Java servlet с базовой функциональностью веб-сервера, а Nginx – полнофункциональный производительный веб-сервер. Использование Nginx на фронт-энде имеет такие преимущества:

  • Nginx безопаснее, чем Tomcat, и может предотвратить множество атак. При необходимости срочно обновить безопасность гораздо проще, быстрее и надёжнее обновить фронтэнд Nginx и не беспокоиться о проблемах совместимости при обновлении Tomcat.
  • Nginx более производителен при обработке трафика HTTP и HTTPS, лучше справляется с поддержкой статического контента, кэшированием и SSL.
  • Nginx легко настроить для прослушивания любого порта, в том числе и 80 и 443.

Если такой вариант вам подходит и вы хотите установить Nginx, сначала удалите ранее добавленное правило Iptables, а затем установите Nginx с помощью команды:

sudo apt-get install nginx

После этого отредактируйте стандартный блок server (/etc/nginx/sites-enabled/default).

sudo nano /etc/nginx/sites-enabled/default

Найдите в нём блок location /, который описывает, как будут обслуживаться запросы, и измените его таким образом:

location / {
proxy_pass http://127.0.0.1:8080/;
}

Директива proxy_pass указывает, что все запросы нужно переадресовывать на локальный IP 127.0.0.1 на TCP-порт 8080, который прослушивает Tomcat. Закройте файл и перезапустите Nginx:

sudo service nginx restart

После этого попробуйте получить доступ к Tomcat в браузере, указав IP сервера и стандартный порт HTTP. URL-адрес будет выглядеть так:

http://ip-адрес-сервера

Если настройка выполнена правильно, на экране появится стандартная страница Tomcat. Если страница не открывается, убедитесь, что правило iptables было удалено, и что установка Tomcat прошла успешно.

Защита Tomcat

Защита Tomcat – вероятно, самая важная задача при оптимизации настроек, о которой довольно часто забывают. К тому же, защитить Tomcat совсем несложно.

Примечание: Чтобы следовать этому разделу, нужно установить и настроить Nginx на фронт-энде, как описано в предыдущем разделе.

Удаление административных веб-приложений

Для Tomcat типичный компромисс между функциональностью и безопасностью также действителен. Таким образом, для повышения безопасности можно удалить стандартные приложения web manager и host-manager. Конечно, это не очень удобно, так как впоследствии придётся выполнять задачи администратора (в том числе и развертывания веб-приложений) из командной строки.

Однако, чтобы не беспокоиться о том, что кто-то может злоупотреблять доступом, лучше удалить инструменты администратора Tomcat. Это улучшение безопасности обычно применяется на сайтах, находящихся на стадии производства.

Веб-приложения администратора хранятся в Ubuntu в пакете tomcat7-admin. Удалите этот пакет.

sudo apt-get remove tomcat7-admin

Ограничение доступа к приложениям администратора

Если вы не хотите удалять приложения администратора, можно, по крайней мере, ограничить к ним доступ. Их URL-адреса:

http://your_servlet_ip/manager/
http://your_servlet_ip/host-manager/

Откройте эти адреса в браузере; если при этом вы получили ошибку 404, значит, эти инструменты были удалены ранее. В таком случае, ознакомьтесь со следующими инструкциями, чтобы узнать, как защитить другие уязвимые ресурсы.

На данном этапе веб-сервер Nginx принимает соединения на порт 80, следовательно, можно получить доступ ко всем приложениям по ссылке:

http://your_servlet_ip

Аналогично, Tomcat слушает порт 8080:

http://your_servlet_ip:8080

По этой ссылке все приложения также доступны. Для повышения безопасности нужно ограничить доступ к ресурсам порта 80 с помощью Nginx. Также нужно частично заблокировать порт 8080 и Tomcat, оставив только локальный доступ и Nginx.

Откройте стандартный виртуальный хост (или блок server):

sudo nano /etc/nginx/sites-enabled/default

После директивы server_name и перед (location /) вставьте следующий код (замените your_local_ip IP-адресом своего компьютера).

...
location /manager/ {
allow your_local_ip;
deny all;
proxy_pass http://127.0.0.1:8080/manager/;
}
...

Добавьте такие же ограничения для приложения host-manager; для этого вставьте ещё один такой блок настроек, заменив manager на host-manager:

...
location /host-manager/ {
allow your_local_ip;
deny all;
proxy_pass http://127.0.0.1:8080/host-manager/;
}
...

Перезапустите Nginx, а затем попробуйте открыть manager и host-manager.

sudo service nginx restart

Откройте браузер и перейдите:

http://your_servlet_ip/manager/
http://your_servlet_ip/host-manager/

Приложения будут доступны с локальной машины. Но если попробовать открыть эти адреса при помощи публичного прокси или другого компьютера, появится ошибка 403 Forbidden.

В качестве дополнительной меры безопасности можно также удалить документацию и примеры Tomcat:

sudo apt-get remove tomcat7-docs tomcat7-examples

Имейте в виду: Tomcat по-прежнему слушает внешние соединения на порте 8080. Следовательно, можно без особого труда обойти защиту Nginx. Чтобы устранить эту проблему, можно настроить Tomcat для прослушивания только локального интерфейса 127.0.0.1. Для этого откройте файл /etc/tomcat7/server.xml:

sudo nano /etc/tomcat7/server.xml

Добавьте address=”127.0.0.1″ в раздел Connector:

...
<Connector address="127.0.0.1" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443" />
...

После перезагрузки Tomcat обновит настройки:

sudo service tomcat7 restart

Теперь сервер Tomcat надёжно защищён.

Отладка параметров JVM

Естественно, базовые принципы тонкой настройки Java Virtual Machine (JVM) применимы и к Tomcat. Конечно, настройка виртуальной машины Java – это целая наука; но существуют и базовые способы настройки:

  • Максимальный размер хипа, Xmx – это максимальный объем памяти, доступный Tomcat. Здесь нужно установить значение, которое оставит достаточно свободного места для работы самого сервера и других его сервисов. Например, если сервер имеет 2 Гб оперативной памяти, то в Xmx безопасно было бы выделить 1 Гб оперативной памяти. Однако имейте в виду, что фактически Tomcat использует немного больше памяти, чем задано в Xmx.
  • Минимальный размер хипа, Xms – это минимальный объем памяти, выделяющийся при запуске. В большинстве случаев он должен совпадать с xmx. Таким образом можно избежать затратного процесса распределения памяти (поскольку размер выделенной памяти будет постоянным).
  • Параметр MaxPermSize отвечает за память, в которой постоянно хранятся классы, и позволяет Tomcat загружать классы приложений и оставлять свободную память Xmx для создания экземпляров этих классов. Если вы не знаете, сколько памяти требуют классы приложений, можете для начала установить в MaxPermSize половину объёма Xmx (512 Мб в данном случае).

В Ubuntu 14.04 отредактировать опции JVM для Tomcat можно в файле /etc/default/tomcat7:

sudo nano /etc/default/tomcat7

Если Tomcat был установлен согласно предложенному в разделе Требования руководству, в файле будет следующа строка:

...
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Xmx512m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC"
...

К примеру, чтобы выделить 1 Гб из 2Гб оперативной памяти для Tomcat, эту строку нужно изменить так:

...
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Xms1024m -Xmx1024m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC"
...

Чтобы обновить настройки, перезапустите Tomcat:

sudo service tomcat7 restart

Предложенные выше настройки JVM хороши для начала, но для корректной работы программ нужно постоянно отслеживать логи Tomcat

(/var/log/tomcat7/catalina.out), особенно после перезапуска Tomcat или развёртывания приложения. Дл этого используется команда tail:

sudo tail -f /var/log/tomcat7/catalina.out

Чтобы остановить tail, нажмите Ctrl-C.

Отслеживайте ошибки типа OutOfMemoryError. Если такие ошибки возникают, отредактируйте параметры JVM и выделите больше памяти в Xmx.

Заключение

Теперь сервер Tomcat защищён и более производителен. Эти базовые процедуры для оптимизации рекомендуется выполнять не только в среде производства, но также для тестирования и среды разработки с доступом к сети Интернет.

Tags: , , , , , ,

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