Назад | Перейти на главную страницу

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

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