Введение
Когда я создавал наше финансовое приложение на Tomcat, я быстро понял, что размещение Tomcat напрямую в публичном Интернете — это не лучшая идея. Сначала это работало, но было ненадежно, сложно защищать и почти невозможно поддерживать в процессе развертывания.
В конечном итоге я решил разместить Nginx перед Tomcat и позволить Nginx обрабатывать все, с чем Tomcat не справляется, особенно завершение SSL, режим обслуживания, кэширование статических файлов и скрытие деталей внутренней инфраструктуры.
В этой статье объясняется точная настройка, которую я использую в производстве сегодня. Это не общий гид. Он специально написан для финансовой системы, которую я развернул, и включает реальные конфигурации и обоснования каждого решения.
Почему мне нужен был Nginx перед Tomcat
1. Чистая страница обслуживания, когда Tomcat перезапускается
В финансовой системе нам часто приходится перезапускать Tomcat во время развертывания или обслуживания. Если Tomcat не работает, пользователь никогда не должен видеть сырую страницу Tomcat 503, которая раскрывает информацию о сервере.
С Nginx пользователи всегда видят дружелюбную страницу обслуживания, даже если Tomcat полностью отключен. Nginx перехватывает ответ 502 или 503 и отображает статическую HTML-страницу, которую я подготовил.
2. SSL намного проще на Nginx
Настройка SSL внутри Tomcat излишне сложна. Вам нужно конвертировать сертификаты в Java keystore, управлять коннектором и иметь дело с несколькими форматами.
С Nginx SSL просто. Мне нужно всего два файла: сертификат и закрытый ключ. Nginx завершает HTTPS, а Tomcat получает только обычный HTTP с localhost. Обновление сертификатов и отладка также проще.
3. Tomcat полностью скрыт от внешнего мира
По соображениям безопасности я не хочу, чтобы Tomcat раскрывал свои порты или информацию о сервере публичным пользователям. Tomcat слушает только на 127.0.0.1:8080.
Если кто-то попытается просканировать мой сервер, он не сможет обнаружить, что Tomcat вообще существует.
4. Большие заголовки для финансовых одобрений
Некоторые операции одобрения в системе отправляют длинный список идентификаторов финансовых приложений в заголовке или строке запроса.
Чтобы поддерживать эти большие заголовки, я настроил Nginx для разрешения больших буферов заголовков. Без этого некоторые запросы могли бы завершиться неудачей, потому что размер заголовка по умолчанию слишком мал.
5. Загрузка больших файлов
Пользователи загружают контракты, счета и отсканированные документы. Я установил чистый лимит размера загрузки в Nginx, чтобы большие файлы даже не доходили до Tomcat, если они сначала не пройдут проверку Nginx.
6. Быстрая подача статического контента (CSS, JS, иконки)
Хотя Tomcat может обслуживать статические файлы, Nginx работает намного быстрее. Я включил кэширование для статических ресурсов, чтобы Nginx обслуживал их напрямую, не беспокоя Tomcat.
7. Пользовательские тайм-ауты для долгих операций
Некоторые процессы в финансовой системе занимают больше времени, например, генерация отчетов или пакетное одобрение.
Nginx дает мне полный контроль над тайм-аутами прокси, чтобы пользователи не получали неожиданные ошибки 504.
Конфигурация HTTPS для Nginx, которую я использую
Я храню этот файл по адресу:
/etc/nginx/sites-available/myapp_https
Вот фактическая конфигурация, упрощенная для статьи, но все еще точная.
server {
listen 443 ssl;
server_name finance.example.com;
ssl_certificate /opt/myapp/keystore/app.crt;
ssl_certificate_key /opt/myapp/keystore/app.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
large_client_header_buffers 4 65k;
client_max_body_size 100m;
error_page 502 503 = @maintenance;
error_page 404 = @errors;
access_log /opt/myapp/nginx/logs/access.log;
error_log /opt/myapp/nginx/logs/error.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://127.0.0.1:8080;
proxy_buffering off;
proxy_buffer_size 128k;
proxy_buffers 100 128k;
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
send_timeout 180;
location ~* \.(css|js|jpg|gif|ico)$ {
proxy_cache cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 301 302 30m;
expires 30m;
proxy_pass http://127.0.0.1:8080;
}
}
location = / {
return 301 /myapp/;
}
location @maintenance {
root /opt/myapp/nginx/www;
rewrite ^ /maintenance.html break;
}
location @errors {
root /opt/myapp/nginx/www;
rewrite ^ /404.html break;
}
}
Это основа системы. Nginx обрабатывает SSL, перенаправляет трафик на Tomcat, отображает страницу обслуживания, когда Tomcat отключен, кэширует статический контент и защищает внутреннюю сетевую структуру.
HTTP Перенаправление (Порт 80)
Я добавил простую конфигурацию, которая перенаправляет весь HTTP-трафик на HTTPS.
/etc/nginx/sites-available/myapp_http
server {
listen 80;
server_name finance.example.com;
return 301 https://$host$request_uri;
}
Структура папок
Я храню файлы, связанные с Nginx, внутри отдельной папки приложения:
/opt/myapp/
keystore/
nginx/
logs/
www/
Это упрощает управление сертификатами, логами и статическими страницами.
Конфигурация Tomcat, которая завершает настройку
Внутри server.xml Tomcat я привязываю Tomcat к localhost, чтобы к нему нельзя было получить доступ извне.
<Connector port="8080"
address="127.0.0.1"
maxHttpHeaderSize="65536"
protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="150"/>
Я также заставляю Tomcat понимать реальный IP клиента и протокол:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>
Это гарантирует, что система записывает правильный IP клиента и корректно работает с HTTPS.
Почему эта настройка хорошо работает для финансовой системы
Размещение Nginx перед Tomcat сделало всю систему гораздо более профессиональной и стабильной. Во время развертываний или перезапусков пользователи никогда не сталкиваются с типичными страницами Tomcat 503. Вместо этого они всегда видят чистый экран обслуживания, что делает систему надежной, даже когда работа происходит за кулисами.
Обработка SSL на Nginx также упрощает все. Сертификаты легче управлять, обновлять и отлаживать, и Tomcat больше не нужно иметь дело с HTTPS напрямую. Еще одно преимущество — безопасность. Поскольку Tomcat слушает только на localhost, он полностью скрыт от внешнего трафика, что устраняет целую категорию попыток сканирования и probing.
Производительность также улучшается. Статические файлы, такие как CSS и JavaScript, загружаются быстрее, потому что Nginx может их кэшировать, а загрузки проверяются и ограничиваются до того, как они вообще достигнут Tomcat. Некоторые из наших финансовых операций связаны с большими заголовками или долгими действиями, и Nginx дает мне полный контроль над размерами буферов и тайм-аутами, что позволяет этим операциям выполняться плавно без случайных ошибок.
Даже в случаях, когда Tomcat отключается на мгновение, сайт все равно отвечает предсказуемо благодаря странице обслуживания. За эти годы эта настройка оказалась чрезвычайно надежной. Она помогла финансовому приложению достичь почти нулевого времени простоя при многих релизах и изменениях инфраструктуры, и продолжает обрабатывать производственный трафик без сюрпризов.