.png)
Я использую Django с Varnish 4.
Я пытаюсь этого добиться:
- Если запрос не относится к домашней странице, пропустите (в данный момент я пытаюсь кэшировать только домашнюю страницу, чтобы протестировать ее и т. д.)
- Если присутствует cookie-файл «sessionid», передайте его или кэшируйте для каждого сеанса.
- Все остальное: пас
Вот конфигурация подпрограммы 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, похоже, всегда генерирует новую страницу для каждого it при вызове домашней страницы как анонимной. Я могу сказать, используя заголовки, которые Varnish отправляет ('возраст' всегда равен 0, а 'X-Varnish' всегда является другим числом).
Либо в моей конфигурации чего-то не хватает, либо это потому, что Django отправляет 'Vary: Cookie' в ответе? Если это так, как мне 'скрыть' куки от Varnish в этом случае (только для анонимных пользователей)?
решение1
«Проблема» заключалась в том, что Django отправлял заголовок «Vary: Cookie»все время. Я думаю, это из-за плагина «auth», но я не исследовал это, я просто удалил заголовок, когда пришел ответ от сервера.
Вот что говорится в документе Varnish о «vary: 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);
}
}