Настройка Varnish 4 VCL для кэширования только определенной страницы для анонимных пользователей (с Django)

Настройка Varnish 4 VCL для кэширования только определенной страницы для анонимных пользователей (с Django)

Я использую 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);
        }
}

Связанный контент