Как стать автором
Обновить

Отображение SSI при использовании прокси на nginx и разделение кеша по языку

Время на прочтение2 мин
Количество просмотров3.2K
Настраивал кеширование на связке 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.
Теперь вы гарантируете, что пользователь не получит из кеша страницу на неизвестном ему языке.
Теги:
Хабы:
Всего голосов 12: ↑9 и ↓3+6
Комментарии0

Публикации

Истории

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область