Я использую Django с Varnish 4.
Я пытаюсь этого добиться:
Вот конфигурация sub vcl_recv:
# cache only home page
if (! req.url == "/") {
return(pass);
}
# not caching if cookie sessionid is present
if (req.http.Cookie ~ "sessionid") {
return(pass);
}
unset req.http.cookie;
Пока что Varnish, кажется, всегда генерирует новую страницу для каждого, когда вызывает домашнюю страницу как анонимную. Я могу сказать, используя заголовки Varnish send («возраст» всегда равен 0, а «X-Varnish» - всегда другое число).
Либо в моей конфигурации что-то не хватает, либо это потому, что Django отправляет в ответ Vary: Cookie? Если это так, как я могу в этом случае «скрыть» файлы cookie от Varnish (только для анонимных пользователей)?
Проблема заключалась в том, что Django отправил заголовок Vary: Cookie. все время. Я думаю, это из-за плагина auth, но я не исследовал это, я просто удалил заголовок, когда ответ пришел с сервера.
Вот что в документе Varnish говорится о файле «varnish: cookie»:
Другой пример неправильного использования - использование только Vary: Cookie для различения ответа. Опять же, может быть очень большое количество файлов cookie и, следовательно, очень большое количество кэшированных объектов, которые, скорее всего, будут извлекаться только их исходными запросчиками.
Источник: https://www.varnish-software.com/book/4.0/chapters/HTTP.html#vary
Вот как выглядит моя конфигурация VCL (я удалил верхнюю часть, которая представляет собой просто конфигурацию сервера):
sub vcl_recv
{
# caching only home page
if (! req.url == "/") {
return(pass);
}
# not caching if cookie sessionid present
if (req.http.Cookie ~ "sessionid") {
return(pass);
}
unset req.http.cookie;
}
sub vcl_backend_response
{
if (bereq.url == "/") {
unset beresp.http.Vary;
return(deliver);
}
}