Установка Apache Tomcat 10 на Rocky Linux 8.5 с Nginx и защитой по SSL

Введение
Apache Tomcat — это сервер приложений с открытым исходным кодом для Java-приложений, реализующий спецификации Java Servlet, JavaServer Pages (JSP), Java Expression Language и Java WebSocket. В этом руководстве мы устанавливаем Tomcat 10 на Rocky Linux 8.5, проксируем трафик через Nginx и защищаем соединения с помощью сертификата от Let’s Encrypt.
Кому полезно это руководство
- Сисадминам и инженерам DevOps, разворачивающим Java-приложения.
- Тем, кто хочет безопасно выставить Tomcat в публичную сеть (через Nginx + SSL).
- Тем, кто предпочитает управлять сервисами через systemd.
Важно: если вы планируете использовать Tomcat 9, большая часть инструкций идентична; отличия будут отмечены.
Основные требования
- Сервер с Rocky Linux 8.5 (доступ по SSH).
- Пользователь с sudo-привилегиями.
- Подключение к интернету для загрузки пакетов и сертификатов.
- Рекомендуется резервная копия важных данных перед началом.
Минимальные пакеты и обновления
Выполните обновление системы и установите утилиты wget и tar:
$ sudo dnf update$ sudo dnf install wget tarПримечание: при использовании SELinux настоятельно рекомендуется проверить контексты файлов и, при необходимости, создать политики (см. раздел «Безопасность и SELinux»).
Шаг 1 — Установка Java (OpenJDK 11)
Tomcat 9 и 10 требуют Java 8 или новее. Рекомендуемая версия для этого руководства — OpenJDK 11.
Установите OpenJDK 11:
$ sudo dnf install java-11-openjdk-develПроверьте версию Java:
$ java -version
openjdk version "11.0.13" 2021-10-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.13+8-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8-LTS, mixed mode, sharing)Короткое определение: OpenJDK — открытая реализация платформы Java.
Альтернатива: можно использовать Zulu/Corretto или другие дистрибутивы JDK при наличии корпоративных требований; в таком случае укажите корректный путь JAVA_HOME в systemd‑единице.
Шаг 2 — Создание системного пользователя для Tomcat
Для минимизации рисков безопасности запускайте Tomcat не от root. Создаём системного пользователя с домашней директорией /opt/tomcat:
$ sudo useradd -m -U -d /opt/tomcat -s /bin/false tomcatПояснение: /bin/false запрещает интерактивную авторизацию для этого пользователя.
Шаг 3 — Загрузка и развёртывание Tomcat
Проверьте актуальную стабильную версию Tomcat 10 на официальном сайте и подставьте в переменную VERSION. В примере используется 10.0.14 (на момент исходного руководства).
$ VERSION=10.0.14
$ wget https://dlcdn.apache.org/tomcat/tomcat-10/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gzРаспакуйте в /opt/tomcat:
$ sudo tar -xf apache-tomcat-${VERSION}.tar.gz -C /opt/tomcat/Создайте символическую ссылку latest для удобства обновлений:
$ sudo ln -s /opt/tomcat/apache-tomcat-${VERSION} /opt/tomcat/latestУстановите владельца директорий на пользователя tomcat:
$ sudo chown -R tomcat:tomcat /opt/tomcatСовет: при будущем апгрейде распакуйте новую версию в /opt/tomcat/apache-tomcat-
Шаг 4 — Создание systemd‑unit файла
Создайте сервисный файл /etc/systemd/system/tomcat.service:
$ sudo nano /etc/systemd/system/tomcat.serviceВставьте следующий блок (проверьте пути JAVA_HOME, если Java установлена в другом месте):
[Unit]
Description=Apache Tomcat 10 Servlet container
Wants=network.target
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/jre"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"
Environment="CATALINA_BASE=/opt/tomcat/latest"
Environment="CATALINA_HOME=/opt/tomcat/latest"
Environment="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown.sh
Restart=always
[Install]
WantedBy=multi-user.targetСохраните файл и выполните перезагрузку демона systemd перед включением сервиса.
Шаг 5 — Запуск и автозапуск Tomcat
$ sudo systemctl daemon-reload
$ sudo systemctl enable tomcat --now
$ sudo systemctl status tomcatПример вывода показывает, что Tomcat успешно запущен. Если сервис не стартует — проверьте журналы journalctl -u tomcat и права доступа к /opt/tomcat.
Критерии приёмки
- systemctl status показывает Active: active (running).
- Порт 8080 слушает локально (netstat/ss).
- Логи Tomcat в /opt/tomcat/latest/logs не содержат фатальных ошибок.
Шаг 6 — Настройка брандмауэра (firewalld)
Проверим состояние firewalld:
$ sudo firewall-cmd --state
runningРазрешаем HTTP и HTTPS:
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --reloadЕсли вы используете нестандартные порты или только внутренний доступ к Tomcat (через Nginx на том же хосте), дополнительно откройте порт 8080 только для localhost или вовсе оставьте закрытым.
Шаг 7 — Настройка веб-интерфейса управления Tomcat (Manager / Host Manager)
Для доступа к менеджеру создайте пользователей в /opt/tomcat/latest/conf/tomcat-users.xml:
$ sudo nano /opt/tomcat/latest/conf/tomcat-users.xmlДобавьте роли и пользователей перед закрывающим тегом (замените логины и пароли на надёжные):
По умолчанию доступ менеджерских приложений ограничен localhost. Чтобы разрешить доступ извне (не рекомендуется без ограничений IP/VPN), отредактируйте файл /opt/tomcat/latest/webapps/manager/META-INF/context.xml и закомментируйте или измените RemoteAddrValve.
$ sudo nano /opt/tomcat/latest/webapps/manager/META-INF/context.xmlЧтобы разрешить доступ только с определённого IP, добавьте ваш публичный IP в список allow (пример для 22.22.22.22):
Сделайте аналогично для /opt/tomcat/latest/webapps/host-manager/META-INF/context.xml. После изменений перезапустите Tomcat:
$ sudo systemctl restart tomcatБезопасность: открывать Manager/Host Manager в публичный доступ не рекомендуется. Используйте VPN, SSH‑туннель или ограничение по IP.
Шаг 8 — Установка SSL через Let’s Encrypt (Certbot)
Добавьте EPEL и установите certbot:
$ sudo dnf install epel-release
$ sudo dnf install certbotЗапрос сертификата (пример для tomcat.example.com):
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d tomcat.example.comСертификаты окажутся в /etc/letsencrypt/live/tomcat.example.com.
Создайте параметры Diffie-Hellman:
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048Создайте директорию веб-рут для автоматического обновления и добавьте ежедневную задачу для проверки и продления сертификатов:
$ sudo mkdir -p /var/lib/letsencrypt
$ sudo nano /etc/cron.daily/certbot-renewКонтент файла:
#!/bin/sh
certbot renew --cert-name tomcat.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"Сделайте файл исполняемым:
$ sudo chmod +x /etc/cron.daily/certbot-renewСовет: вместо cron можно использовать systemd‑таймер для более гибкого контроля и логирования.
Шаг 9 — Установка и настройка Nginx как обратного прокси
Установите Nginx (модульная ветка 1.20):
$ sudo dnf module install nginx:1.20Проверьте версию и запустите сервис:
$ nginx -v
nginx version: nginx/1.20.1
$ sudo systemctl enable nginx --nowСоздайте конфигурацию /etc/nginx/conf.d/tomcat.conf:
$ sudo nano /etc/nginx/conf.d/tomcat.confВставьте:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name tomcat.example.com;
access_log /var/log/nginx/tomcat.access.log;
error_log /var/log/nginx/tomcat.error.log;
# SSL
ssl_certificate /etc/letsencrypt/live/tomcat.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tomcat.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/tomcat.example.com/chain.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
resolver 8.8.8.8;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# enforce HTTPS
server {
listen 80;
listen [::]:80;
server_name tomcat.example.com;
return 301 https://$host$request_uri;
}Отредактируйте /etc/nginx/nginx.conf и увеличьте server_names_hash_bucket_size, вставив перед include /etc/nginx/conf.d/*.conf;:
server_names_hash_bucket_size 64;Проверка и перезапуск:
$ sudo nginx -t
$ sudo systemctl restart nginxСоветы по проксированию
- Убедитесь, что прокси передаёт заголовок X-Forwarded-For и Host (указано в конфигурации). Это нужно для корректной генерации ссылок и логов в Tomcat.
- Если Nginx и Tomcat находятся на разных серверах, настройте брандмауэр так, чтобы порт 8080 был доступен только от Nginx.
Шаг 10 — Тестирование в браузере
Откройте https://tomcat.example.com — вы должны увидеть веб-интерфейс Tomcat.

Войдите в Manager и Host Manager с учётными данными, указанными в шаге 7.
Если страница не открывается:
- Проверьте
sudo systemctl status tomcatиjournalctl -u tomcat. - Проверьте
sudo systemctl status nginxи логи /var/log/nginx/*.log. - Убедитесь, что сертификат корректно сгенерирован и файлы цепочки существуют.
Безопасность и SELinux
Важно учитывать следующие моменты безопасности:
- Не выставляйте Manager и Host Manager в интернет без ограничения по IP или без VPN.
- Используйте надёжные пароли и, по возможности, двухфакторную аутентификацию вне Tomcat (например, через обратный прокси с базовой аутентификацией + ограничение по IP).
- SELinux: на Rocky Linux SELinux обычно включён. Если после установки Tomcat или Nginx наблюдаются ошибки доступа, проверьте audit.log и примените необходимые контексты
semanage fcontextиrestorecon, либо создайте модуль политики. - Журналирование: перенаправляйте и централизуйте логи Tomcat и Nginx (rsyslog, Filebeat, Graylog и т.п.).
Пример проверки SELinux в случае проблем с доступом к сертификатам:
$ sudo ausearch -m avc -ts recent
$ sudo semanage fcontext -a -t cert_t "/etc/letsencrypt(/.*)?"
$ sudo restorecon -Rv /etc/letsencryptРезервирование, откат и план восстановления
Резервируйте следующие вещи перед изменением версии Tomcat или конфигурации:
- /opt/tomcat/latest/conf (server.xml, tomcat-users.xml и т.д.)
- Веб-приложения в /opt/tomcat/latest/webapps
- Файлы сертификатов /etc/letsencrypt
- systemd‑unit /etc/systemd/system/tomcat.service и nginx конфигурации
Простой план отката:
- Остановите сервисы:
sudo systemctl stop nginx tomcat. - Восстановите файлы конфигурации и симлинк latest к предыдущей версии Tomcat.
- Включите сервисы:
sudo systemctl daemon-reload && sudo systemctl start tomcat nginx. - Проверьте логи и статус.
Роль‑ориентированные чеклисты
Администратор Linux:
- Установить OpenJDK, wget, tar.
- Создать пользователя tomcat и установить права.
- Развернуть Tomcat в /opt/tomcat и настроить systemd.
Инженер безопасности:
- Проверить доступ к Manager/Host Manager.
- Настроить ограничения по IP, SELinux и firewall.
- Проверить политики SSL (отключить слабые протоколы).
DevOps / CI инженер:
- Настроить процесс обновления Tomcat (симлинк latest, миграционные шаги).
- Интегрировать развёртывание артефактов в Manager или через CI/CD pipeline.
Мини‑методология развёртывания (шаги высокого уровня)
- Подготовить OS и зависимости (обновления, пакеты).
- Установить JDK и проверить окружение.
- Развернуть Tomcat и создать systemd‑юнит.
- Настроить обратный прокси (Nginx) и SSL.
- Тестирование и проверка логов.
- Документирование и бэкап конфигураций.
Часто встречаемые ошибки и рекомендации по устранению
- Проблема: Tomcat не стартует — проверьте
journalctl -u tomcatи права на /opt/tomcat. - Проблема: 502 Bad Gateway от Nginx — проверьте, что Tomcat слушает на 127.0.0.1:8080 и что proxy_pass совпадает.
- Проблема: Certbot не может получить валидацию — проверьте, что порт 80 открыт и не занят другим процессом.
Миграция с Tomcat 9 на Tomcat 10 — заметки по совместимости
Tomcat 10 использует Jakarta EE namespace (javax. -> jakarta.) для некоторых API. Приложения, скомпилированные для Tomcat 9 (Java EE / javax), могут требовать перекомпиляции или преобразования (иной namespace) для корректной работы в Tomcat 10. Если вы планируете миграцию приложений, сначала протестируйте их на staging‑окружении.
Короткий словарь терминов
- Tomcat — контейнер сервлетов и веб-приложений Java.
- Nginx — быстрый HTTP-сервер и обратный прокси.
- Certbot — клиент для автоматического запроса и продления сертификатов Let’s Encrypt.
- systemd — система инициализации и менеджер сервисов в современных дистрибутивах Linux.
Итоговое резюме
Вы установили Tomcat 10 на Rocky Linux 8.5, настроили его запуск как systemd‑сервис, организовали проксирование через Nginx и обеспечили доверенное соединение по HTTPS с сертификатом Let’s Encrypt. Дополнительно рассмотрены основные шаги по безопасности, резервированию и откату.
Вопросы и дальнейшие шаги
- Рекомендуется автоматизировать развёртывание и обновления с помощью Ansible/Docker/Kubernetes в зависимости от масштаба.
- По вопросам миграции приложений между версиями Tomcat обращайте внимание на namespace Jakarta EE.
Important: всегда проверяйте и обновляйте используемые компоненты безопасности и сертификаты.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента