Почему я получаю услугу 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, и отправлять этот заголовок ответа только для ресурсов, которые содержат включения.

Другие вопросы по тегам