Лакировать 6 пропущенных запросов на один и тот же URL-адрес, поступающих из разных браузеров

#varnish #varnish-vcl

#varnish #varnish-vcl

Вопрос:

Вот как выглядит мой varnish.vcl.

 vcl 4.0;

import directors;
import std;

backend client {
    .host = "service1";
    .port = "80";
}

sub vcl_recv {

    std.log("varnish log info:"   req.http.host);

    # caching pages in client

    set req.backend_hint = client;

    # If request is from conent or for pages remove headers and cache
    if ((req.url ~ "/content/") || (req.url ~ "/cms/api/") || req.url ~ ".(png|gif|jpg|jpeg|json|ico)$" || (req.url ~ "/_nuxt/") ) {
        unset req.http.Cookie;
        std.log("Cachable request");
    }
    # If request is not from above do not cache and pass to Backend.
    else
    {
        std.log("Non cachable request");
        return (pass);
    }
}


sub vcl_backend_response {
    if ((bereq.url ~ "/content/") || (bereq.url ~ "/cms/api/") || bereq.url ~ ".(png|gif|jpg|jpeg|json|ico)$" || (bereq.url ~ "/_nuxt/") )
    {
        unset beresp.http.set-cookie;
        set beresp.http.cache-control = "public, max-age=259200";
        set beresp.ttl = 12h;
        return (deliver);
    }

}

# Add some debug info headers when delivering the content:
# X-Cache: if content was served from Varnish or not
# X-Cache-Hits: Number of times the cached page was served
sub vcl_deliver {

        # Was a HIT or a MISS?
        if ( obj.hits > 0 )
        {
                set resp.http.X-Cache-Varnish = "HIT";
        }
        else
        {
                set resp.http.X-Cache-Varnish = "MISS";
        }

        # And add the number of hits in the header:
        set resp.http.X-Cache-Hits = obj.hits;
}
 

Если я захожу на страницу из того же браузера, отображается вкладка netwrok

X-Cache-Varnish = «ПОПАДАНИЕ»;
X-Cache-Хиты = ;

Допустим, если я загружаю Chrome 10 раз, это то, что я получаю

X-Cache-Varnish = «ПОПАДАНИЕ»;
X-Cache-Hits = 9;

9, потому что сначала был промах, а остальные 9 были отправлены из кэша.

Если я попробую окно инкогнито или другой браузер, он получит свой собственный счетчик, начиная с 0. Я думаю, что каким-то образом я все еще кэширую файлы cookie. Я не смог определить, чего мне не хватает.

В идеале я хочу удалить все файлы cookie для определенных путей. но почему unset -то, похоже, у меня это не работает.

Ответ №1:

Если вы действительно хотите убедиться, что эти запросы кэшируются, убедитесь, что вы выполнили a return(hash); в своем if-заявлении.

Если вы не вернетесь, встроенный VCL вступит во владение и продолжит выполнять свое стандартное поведение.

Кроме того, неясно, устанавливает ли ваш серверный Vary сервер заголовок, который может повлиять на вашу частоту посещений.

Вместо того, чтобы гадать, я предлагаю использовать журналы, чтобы выяснить это.

Выполните следующую команду для отслеживания ваших запросов:

 varnishlog -g request -q "ReqUrl ~ '^/content/'"
 

Выражение запроса VSL этого оператора предполагает, что URL начинается с /content . Пожалуйста, настройте соответствующим образом.

Пожалуйста, пришлите мне выдержку varnishlog для 1 конкретного URL-адреса, а также для обеих ситуаций:

  • Тот, который попадает в кеш на обычной вкладке браузера
  • Тот, который приводит к пропуску кэша в режиме инкогнито или из другого браузера

Журналы предоставят больше контекста и объяснят, что произошло.