Настраивал кеширование на связке nginx+apache на сервере под управлением Ubuntu. Хотел бы поделиться с некоторыми нюансами с которорими я столкнулся в процесе работы. А имеено с проблемой отображения ssi интсрукций для nginx и разделением кеша с учетом языковой куки.
Проблемы с отображением SSI при использовании прокси на nginx
Для отображения динамических блоков решил использовать ssi. На локальной машине с все работало отлично, но после выкладки на сервер ssi блоки не обрабатывались.
В качастве проксирующего веб-сервера используеться апач. После ряда экспериментов установил, что при использовании fastcgi блоки ssi обрабатывались отлично. То есть проблема в прокси-серевере apache.
Начал анализировать заголовки апача на локальной машине и на сервере:
$curl -I http://apache_host:port
Заметил интересный заголовок
Vary: Accept-Encoding
Нашел описание тут. То есть я могу посылать заголовки для установки сжатия:
$curl -I -H 'Accept-Encoding: gzip,deflate' http://apache_host:port
...
Content-Encoding: gzip
...
То есть проксирующий сервер отдавал контент в сжатом виде и nginx не мог распарсить ssi инструкции.
За сжатие на апаче отвечает mod_deflate. Лечиться все это отключением этого модуля:
$a2dismod deflate
Module deflate disabled.
Run '/etc/init.d/apache2 restart' to activate new configuration!
$/etc/init.d/apache2 restart
Настройка разделения кеша по языку
На сайте, который я настраивал, язык устанавливаеться с помощью куки, то есть нет уникальных урлов (это уже к сеошникам :) ).
Чтобы разделить кеш для разных языков я использовал ключ:
proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri|$lang";
Обратите внимание на последний параметр $lang. Для его установки я использовал ngx_http_map_module:
map $http_accept_language $browser_lang {
default en;
~ru ru;
~da da;
~de de;
}
map $cookie_name_of_language_cookie $lang {
default $browser_lang;
~en en;
~de de;
~ru ru;
~da da;
}
server {
...........
}
Первая директива определяет язык браузера и потом используеться во второй по умолчанию при отсутствии языковой куки. Обратите внимание что mod нужно добавлять в контекст http, в моем случае это было перед server.
Теперь вы гарантируете, что пользователь не получит из кеша страницу на неизвестном ему языке.
Автор: Nazarvi