Назад | Перейти на главную страницу

Как кэшировать веб-страницы с персонализированным заголовком, используя обратный прокси-сервер кеширования, такой как Squid, Varnish или Nginx

Практически каждая страница моего сайта генерируется динамически. Однако они не так часто меняются (как на странице форума). Поэтому я хотел бы кэшировать их с помощью обратного прокси-сервера кеширования, такого как Squid, varnish или Nginx.

Проблема в том, что для моих вошедших в систему пользователей каждый из них увидит персонализированный заголовок с надписью «Добро пожаловать, Джон Доу. Выйти» в правом верхнем углу страницы (как при сбое сервера). А пользователи, которые не вошли в систему, вместо этого увидят заголовок с надписью «Войти».

Таким образом, в основном, даже если каждый пользователь будет видеть одну и ту же страницу в целом, все они немного различаются по версии из-за этого персонализированного заголовка.

Есть ли способ кэшировать «основную» часть страницы и обслуживать ее из кеша, динамически генерируя персонализированный заголовок для каждого отдельного пользователя?

Это должно быть очень распространенная проблема. Как вообще решается?

Единственное, что вы можете сделать (помимо ESI, который не устраняет проблемы с пропускной способностью и не сокращает количество запросов, которые вы должны обслуживать), - это разбить страницу на несколько объектов. Например, все общедоступные материалы находятся на одной странице с возможностью кеширования, а затем персонализированные элементы извлекаются через AJAX / iFrame. Это своего рода способ работы iGoogle, за исключением обратного ... в случае iGoogle базовая страница настраивается, но выбранные вами компоненты RSS-канала являются общедоступными, кешируемыми и переносятся на главную страницу через AJAX.

С Varnish вы можете использовать ESI, однако страницы, обработанные ESI, не могут быть сжаты без некоторой дополнительной сложности. http://varnish-cache.org/wiki/ESIfeatures

Я не использовал это в производстве, но Nginx также предоставляет функциональность ESI через плагин, http://wiki.github.com/taf2/nginx-esi/

Nginx обеспечивает кеширование через http://wiki.nginx.org/NginxHttpProxyModule#proxy_cache а с другим плагином будет обрабатывать как сборку фрагментов, так и кеширование.

http://www.trygve-lie.com/blog/entry/esi_explained_simple объясняет ESI.

В качестве альтернативы вы можете сделать собственное кеширование фрагментов на стороне приложения.

Да, кешируйте главную страницу, но отдельные компоненты входят в вызовы AJAX, и вам нужно поместить конвейер в vcl_recv для этих URL-адресов.

если (req.url ~ "/ some-ajax-call") {return (pipe); }