Как кешировать объект на Varnish, но скажите клиенту не кешировать его - PullRequest
0 голосов
/ 06 декабря 2018

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

В настоящее время у меня есть следующий конфигурационный файл для vcl_backend_response:

sub vcl_backend_response {
    unset beresp.http.Set-Cookie;
    #unset beresp.http.Cache-Control;
    #set beresp.http.Cache-Control = "no-cache";

    if (bereq.url ~ "^/products/\d+/details") {
        set beresp.ttl = 1h;
    }
}

Но, используя эту конфигурацию, клиент кэширует ответ в течение 1 часа и не запрашивает снова, даже кэш очищается от Varnish.

Если я раскомментирую строки, связанные с управлением кэшем, этоtime Varnish не кэширует страницу и всегда запрашивает свежую копию с внутреннего сервера.

Это достижимо в Varnish v6.0?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Да, это возможно:

  • Определить логику для продолжительности кэширования с помощью Varnish внутри vcl_backend_response.
  • Определить логику длякак долго вещи кэшируются кэшем браузера внутри vcl_deliver.

Таким образом, клиенты (браузеры) могут быть проинструктированы для кэширования с другим TTL, чем Varnish.Следующее гарантирует, что браузеры не будут кэшировать ответ:

sub vcl_deliver {
    set resp.http.Pragma = "no-cache";
    set resp.http.Expires = "-1";
    set resp.http.Cache-Control = "no-store, no-cache, must-revalidate, max-age=0";
}

Более того, если вы можете изменить свое приложение, вы можете прибегнуть к более тонкому подходу, описанному в первом решении здесь , чтоотправляет один заголовок Cache-Control, который определяет кэширование TTL для общих кэшей (Varnish) и частных кэшей (браузер) по-разному:

Cache-Control: s-maxage=31536000, max-age=86400

В приведенном выше заголовке браузер будет указывать кэшировать ресурс для 86400секунд, в то время как Varnish будет кешировать 31536000. Это потому, что s-maxage применяется только к совместно используемым кешам.Varnish оценивает его, а браузеры - нет.

0 голосов
/ 06 декабря 2018

попробуйте добавить заголовки Cache-Control: no-cache, must-revalidate

...