опубликовано

Настройка nginx в качестве прокси-сервера для tomcat

Появилась необходимость настроить nginx для tomcat. Nginx будет кешировать всю статику и отдавать ее сразу клиенту без обращения к tomcat, тем самым уменьшит нагрузку на tomcat в целом.

gzip on;
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 5;
gzip_proxied any;
gzip_types text/plan text/css application/json application/x-javascript  
 text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js;
gzip_buffers 16 8k;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";  

#Путь хранения кэша, уровень вложенности, имя и размер зоны, время не
#использования кэша после которого он удаляется, максимальный размер кэша 
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=serg_cache:90m inactive=100m max_size=110m;

Далее настроим, что нам необходимо кешировать и какие передавать заголовки tomcat. Кешируем все картинки, таблицы стилей и js. В своих файлах я добавляю параметр ?v= версию файла, при изменении я увеличиваем цифру или указываю дату (например так 20150223), тем самым говорим бразеру, что бы он перезагрузил файл с сервера, а не брал копию из своего кэша. В коментарии есть пояснения для основных значений конфигурации.

location / {

if ($request_uri ~* ".(jpg|jpeg|gif|css|png|ico|js)(\?v=[0-9.]+)?$") {
	#говорим браузеру, что кешированные файлы нужно хранить 3 дня 
	expires 3d;
	access_log off;
	break;
}

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 Host $host;
proxy_set_header X-Forwarded-Proto $scheme;

add_header X-Cache-Status $upstream_cache_status;

#адресс tomcat
proxy_pass http://localhost:8080;

index index.jsp
proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
proxy_cache serg_cache;
proxy_cache_min_uses 1;
proxy_cache_valid 200 302 120m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;

set $no_cache "";

#не кешировать если у пользователя есть кука начинающаяся на JSESSION
if ($http_cookie ~* "JSESSION*"){
	set $no_cache 1;
}

#если в uri есть management или client
if ($request_uri ~* "(/management*|/client*)") {
	set $no_cache 1;
}

proxy_no_cache $no_cache;
proxy_cache_bypass $no_cache;
}

Теперь необходимо настроить сам tomcat. Для этого достаточно в файле server.xml прописать.

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

comments powered by Disqus