Коротко. Apache Tomcat — сервер приложений для Java, на котором работает множество enterprise-сервисов. В статье — пошаговая установка на Linux и Windows, настройка server.xml, портов и памяти (JAVA_OPTS/CATALINA_OPTS), пользователей и SSL, автозапуск через systemd, оптимизация и разбор частых ошибок конфигурации.
Apache Tomcat — это сервер приложений с открытым исходным кодом для Java: на нём разворачивают сервлеты и JSP-страницы, тестируют код и запускают в проде enterprise-приложения. Ниже разберём, как правильно настроить Tomcat — от установки до автозапуска и защиты сервера.
Tomcat — распространённый инструмент среди веб-разработчиков на Java. Программное обеспечение имитирует работу полноценного веб-сервера: поддерживает сессии, взаимодействие с клиентом и обработку HTTP-запросов, поэтому на нём удобно разворачивать и тестовые стенды, и промышленные сервисы.
Tomcat остаётся одним из самых популярных серверов приложений для Java: проект развивается более 25 лет, а сфера применения — от учебных pet-проектов до банковских и государственных систем.
Основные настройки
Их разместили в файле server.xml. Для внесения изменений обычно необходимо его редактировать. Все настройки Tomcat можно разделить на основные категории:
- глобальные;
- верхнеуровневые;
- встраиваемые компоненты;
- контейнеры;
- соединители.
Кратко расскажем о настройках и их возможностях.
Основные элементы
Эти компоненты играют главную роль при настройке системы. Всего их три.
- Catalina — отвечает за развертывание программы в определенном контейнере. Ее можно считать отдельным контейнером сервлетов, размещенным внутри самого Tomcat.
- Coyote — его задача заключается в прослушивании запросов вида HTTP, их анализе, передаче на обработку и отправлении ответов. По сути, именно этот компонент отвечает за имитацию функции веб-сервера.
- Jasper — необходим для применения технологии JSP. Она дает возможность размещать внутри страницы различные данные по тому же принципу, что и в HTML-файлах. Можно сказать, что этот компонент перерабатывает джава-код в HTML.
Верхнеуровневые элементы
К ним относятся две сущности:
- Сервер — это основа программы. В нем хранят элементы конфигурации. Также серверу можно задать атрибуты для портов. Например, можно настроить командную строку для определенного порта, чтобы отключать его.
- Сервис — его размещают на сервере. Основная задача — связывать воедино все помещенные в него компоненты. Пользователю необходимо задать его имя через атрибут.
Соединители
Их нужно поместить в сервис, чтобы запросы с портов уходили в один общий компонент. В Tomcat есть два вида соединителей или коннекторов.
- AJP — работает для связи с одноименным протоколом. За счет его реализации Tomcat может интегрироваться в Апач.
- HTTP — предоставляет функциональность полноценного веб-сервера. При его настройке можно задать треды для управления запросами и дать возможность выполнять сервлеты.
Типовой HTTP-коннектор в conf/server.xml выглядит так:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
Атрибут port задаёт порт прослушивания, connectionTimeout — максимальное время ожидания запроса в миллисекундах, а redirectPort указывает, на какой порт перенаправлять запросы, требующие защищённого соединения.
Установка Tomcat: пошаговая инструкция
Перед установкой стоит учитывать версию продукта: Tomcat 10 и 11 перешли на пространство имён Jakarta EE (jakarta.servlet вместо javax.servlet) и требуют Java 17+, тогда как Tomcat 9 совместим с более старыми Java-приложениями на javax.* и работает начиная с Java 8. Выбирайте версию исходя из того, под какое пространство имён написано ваше приложение.
- Проверьте установленную Java:
java -version. Без совместимой JRE/JDK запускать Tomcat бессмысленно. - Скачайте дистрибутив с официального сайта
tomcat.apache.org— под Linux это tar.gz, под Windows — zip-архив. - Распакуйте архив в целевую директорию, например:
tar -xzf apache-tomcat-*.tar.gz -C /opt/tomcat --strip-components=1 - Дайте права на исполнение скриптам в Linux:
chmod +x /opt/tomcat/bin/*.sh. - Запустите сервер:
bin/startup.shна Linux илиbin/startup.batна Windows. - Проверьте работоспособность по адресу
http://localhost:8080— должна открыться стартовая страница Tomcat. Остановить сервер можно командойbin/shutdown.sh(shutdown.batна Windows).
Настройка порта в server.xml
Если порт 8080 уже занят другим сервисом или закрыт политикой безопасности, его меняют в том же элементе Connector. Например, чтобы Tomcat слушал 8081, достаточно поменять значение атрибута:
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
После правки server.xml сервер нужно перезапустить (shutdown.sh, затем startup.sh), чтобы изменения вступили в силу. Не забудьте открыть новый порт в файрволе, если Tomcat принимает внешние запросы напрямую, а не через reverse-proxy.
Настройка памяти: JAVA_OPTS и CATALINA_OPTS
По умолчанию Tomcat запускается с настройками памяти JVM «из коробки», которых часто не хватает под нагрузку. Задать лимиты можно через переменные окружения в файле bin/setenv.sh (создайте его, если отсутствует):
CATALINA_OPTS="-Xms512m -Xmx2048m -XX:MaxMetaspaceSize=256m -server"
JAVA_OPTS и CATALINA_OPTS — не одно и то же: JAVA_OPTS применяются и к самой JVM, и к служебным скриптам управления (startup, shutdown, version), а CATALINA_OPTS влияют только на процесс запущенного сервера. Именно поэтому настройки памяти принято задавать через CATALINA_OPTS — так они не затрагивают вспомогательные утилиты.
| Флаг | Назначение |
|---|---|
-Xms | Начальный размер кучи JVM — сколько памяти резервируется сразу при старте |
-Xmx | Максимальный размер кучи — сервер не сможет выделить больше этого значения |
-XX:MaxMetaspaceSize | Лимит памяти под метаданные классов, отдельно от кучи |
-server | Включает серверный режим JIT-компиляции JVM — эффективнее для долгоживущих процессов |
Пользователи и роли: tomcat-users.xml
Доступ к веб-панели Tomcat Manager и удалённому развёртыванию приложений настраивают в файле conf/tomcat-users.xml. Пример добавления пользователя с правами администратора:
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="admin" password="сложный-пароль" roles="manager-gui,admin-gui"/>
Основные роли: manager-gui — доступ к веб-интерфейсу менеджера, manager-script — управление через HTTP-запросы (используется в CI/CD), admin-gui — доступ к административной консоли хоста. Задавайте сложные пароли и не оставляйте дефолтные учётные записи из примеров документации — это одна из самых частых причин взлома серверов на Tomcat.
Автозапуск Tomcat как systemd-сервис (Linux)
Чтобы Tomcat поднимался автоматически после перезагрузки сервера, создайте unit-файл /etc/systemd/system/tomcat.service:
[Unit]
Description=Apache Tomcat
After=network.target
[Service]
Type=simple
User=tomcat
Environment=CATALINA_HOME=/opt/tomcat
ExecStart=/opt/tomcat/bin/catalina.sh run
ExecStop=/opt/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
Дальше — стандартные команды systemd:
systemctl daemon-reload
systemctl enable tomcat
systemctl start tomcat
systemctl status tomcat
Обратите внимание: сервис запускается от отдельного пользователя tomcat, а не от root — так при компрометации веб-приложения злоумышленник не получит полный доступ к системе.
SSL-сертификат для Tomcat
Есть два рабочих способа включить HTTPS. Первый — терминировать TLS на самом Tomcat: сгенерировать хранилище ключей командой keytool -genkey -alias tomcat -keyalg RSA -keystore keystore.jks и добавить в server.xml защищённый коннектор:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="/opt/tomcat/conf/keystore.jks"
keystorePass="пароль-хранилища" clientAuth="false" sslProtocol="TLS" />
Второй, более распространённый на практике способ — вынести терминацию TLS на reverse-proxy (Nginx или Apache HTTPD) перед Tomcat, а сам сервер приложений держать в закрытом контуре на HTTP. Это упрощает продление сертификатов (например, через Let's Encrypt) и не требует хранить приватные ключи внутри Java-процесса.
Развёртывание приложения
Когда система установит Tomcat, проверьте сервер на работоспособность через стартовую страницу по адресу http://localhost:8080. Стандартный проект под Tomcat имеет типовую структуру:
- файл src — в нем находятся исходные данные;
- в папке web есть файл web.xml — с инструкциями по развёртыванию;
- в ней же находится index.jsp — главная страница веб-приложения.
Чтобы запустить готовый проект в Tomcat, его нужно собрать в war-файл — именно в нём хранятся все данные о проекте. В IDE (например, IntelliJ IDEA) это делается через вкладку «Артефакты»: создаётся манифест «Веб-приложение: архив», указывается путь к папке проекта, а затем во вкладке «Сборка» → «Сборка артефактов» выбирается нужная конфигурация — на выходе получится war-файл в директории out.
Есть и способ без IDE — собрать war-архив вручную из командной строки и просто скопировать его в папку автодеплоя:
jar -cvf myapp.war -C build/ .
cp myapp.war /opt/tomcat/webapps/
По умолчанию у Tomcat включён autoDeploy — сервер сам распакует war-файл и развернёт приложение в течение нескольких секунд, без перезапуска.
Оптимизация производительности и типичные ошибки
- Настройте пул потоков. Атрибуты
maxThreadsиacceptCountу коннектора определяют, сколько запросов сервер обработает параллельно и сколько поставит в очередь — значения по умолчанию рассчитаны на лёгкую нагрузку и редко подходят для прод-трафика. - Отключите AJP-коннектор, если он не используется. Уязвимость Ghostcat (CVE-2020-1938) как раз эксплуатировала открытый наружу AJP-порт 8009 — если интеграция с Apache HTTPD не нужна, коннектор лучше закомментировать в server.xml.
- Не запускайте процесс от root. Отдельный системный пользователь ограничивает ущерб при компрометации приложения (см. пример systemd-юнита выше).
- Включите сжатие ответов. Атрибут
compression="on"у HTTP-коннектора снижает объём трафика для текстовых ответов почти без нагрузки на CPU. - Настройте ротацию логов. Файл
logs/catalina.outрастёт без ограничений — подключите logrotate или встроенныйClassLoaderLogManagerс ежедневной ротацией. - Мониторьте JVM через JMX. Метрики кучи, GC и числа потоков помогают поймать утечки памяти до того, как они уронят сервис.
Частые вопросы
Чем Tomcat отличается от полноценного сервера приложений вроде WildFly или GlassFish?
Tomcat — облегчённый контейнер сервлетов: он реализует только веб-профиль Jakarta EE (Servlet, JSP, WebSocket). WildFly и GlassFish — полноценные EE-серверы с EJB, JMS и JTA «из коробки». Для большинства веб-приложений возможностей Tomcat достаточно, а поддерживать его проще и дешевле.
Какой порт использует Tomcat по умолчанию?
По умолчанию Tomcat слушает порт 8080 для HTTP-соединений и порт 8009 для AJP. Оба порта задаются атрибутом port у элемента Connector в файле conf/server.xml и их можно изменить на любые свободные.
Как проверить, что Tomcat запущен и работает?
Откройте в браузере http://localhost:8080 — должна показаться стартовая страница Tomcat. На сервере без графического интерфейса используйте systemctl status tomcat (если сервис настроен через systemd) или ps aux | grep tomcat, чтобы убедиться, что процесс запущен.
Нужно ли открывать панель Tomcat Manager наружу?
Нет. Веб-панель /manager стоит ограничивать доступом только с localhost или через VPN: открытый наружу менеджер с дефолтными или слабыми учётными данными — одна из самых частых причин взлома серверов на Tomcat.
Чем отличаются переменные JAVA_OPTS и CATALINA_OPTS?
JAVA_OPTS применяются и к самой JVM, и к служебным скриптам управления Tomcat (startup, shutdown), а CATALINA_OPTS действуют только на процесс запущенного сервера. Настройки памяти -Xms и -Xmx принято задавать именно через CATALINA_OPTS, чтобы не затронуть вспомогательные утилиты.
Можно ли развернуть Tomcat в Docker?
Да, официальный образ tomcat на Docker Hub — стандартный способ запуска в контейнерных средах. Файлы конфигурации (server.xml, tomcat-users.xml) и war-архивы приложения подключаются через volumes либо собираются в собственный Docker-образ поверх базового.
Нужны разработчики в команду?
Подберём инженеров нужного стека под ваш проект — быстрый старт.




