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

в 7:19, , рубрики: apache2, nginx, proxy, Песочница, метки: , ,

Настраивал кеширование на связке 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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js