Настраивал кеширование на связке 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.
Теперь вы гарантируете, что пользователь не получит из кеша страницу на неизвестном ему языке.