Почему я получаю услугу 503, недоступную для фрагмента ESI, используя Varnish?
Я настроил локально Varnish и внедрил фрагмент ESI в определенной области страницы; но как только я включаю ESI в файле default.vcl, лак прекращает кэширование и, более того, в этом конкретном разделе страницы, где добавляется фрагмент, вместо этого отображается уведомление о недоступности службы 503.
Строка, которая, кажется, останавливает кеширование лака, является оператором else здесь:
if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
unset beresp.http.set-cookie;
set beresp.ttl = 20m;
}
else {
set beresp.do_esi = true;
}
Вот мой default.vcl: http://pastebin.com/MEQF4Gbk
Теперь, в RxHeaders я получаю много "ESI_xmlerror c Нет обработки ESI, первый символ не '<'"
Вот пример одного из RxHeaders (для файла JS) http://pastebin.com/tX7zpBN1
Я думаю, я не понимаю, как я могу сказать, что лак кэшируется, только если у него есть фрагмент ESI? Может кто-нибудь объяснить, что я делаю не так?
1 ответ
Ваш vcl настроен на обработку esi не только страницы, содержащей esi, но и сами фрагменты esi, и последние не работают, что приводит к 503s вместо нужного фрагмента. Если вы не хотите рекурсивно обрабатывать фрагменты как сами контейнеры esi, вы можете изменить свой VCL на:
if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {
unset beresp.http.set-cookie;
set beresp.ttl = 20m;
}
else if (req.esi_level == 0 ) {
set beresp.do_esi = true;
}
Если вы хотите обработать эти включения как сами контейнеры esi, убедитесь, что они начинаются с угловой скобки <
(Лак 2 по умолчанию выполняет только ESI для HTML / XML). Если это невозможно, вы можете настроить не обращать внимания на лак, установив этот параметр при запуске varnishd:
esi_syntax=0×1
На вашем месте я бы включил esi специально для ресурсов, которые могут содержать esi:includes, а не отключал его для выбранных типов контента, как вы делаете. Таким образом, вам не нужно поддерживать список в VCL, который может измениться, а ресурсы, которые не содержат esi, не будут тратить время на их поиск. Вы можете сделать это на основе заголовка ответа из бэкэнда, такого как X-Varnish-Do-Esi, и отправлять этот заголовок ответа только для ресурсов, которые содержат включения.