2

我正在尝试使用 varnish 来缓存 rpm 和其他巨型二进制文件。我所期望的是,当缓存中的对象过期时,清漆会向后端发送带有 If-Not-Modified 的请求,然后假设对象没有更改,清漆会刷新本地缓存对象上的 ttl无需下载新的。我编写了一个测试后端来生成特定的请求(设置小的 max-age 和诸如此类的东西,以及查看标头清漆发送),但我从来没有得到任何其他东西然后完全获取。If-Not-Modified 从不发送。我的 VCL 基本上是默认的 VCL。我尝试设置小 ttl/grace,但从未得到任何有趣的行为。

清漆甚至能够做我想做的事吗?如果是这样,有没有人做过类似的事情并可以提供提示?

4

2 回答 2

0

当对象过期时发送到后端的请求是 Varnish 从客户端收到的请求。

If-Not-Modified因此,在测试您的设置时,您是否在向 Varnish 的请求中发送了标头?

看看https://www.varnish-software.com/wiki/content/tutorials/varnish/builtin_vcl.html看看内置的 VCL 是什么。

vcl_backend_fetch, 如果缓存中没有对象将被调用,您可以看到陈旧对象周围没有复杂的逻辑,它只是按原样传递请求。

于 2017-08-29T12:13:18.660 回答
0

首先,自发布此问题以来,清漆缓存中发生了很多事情。我正在回答关于 varnish-cache 6.0 及更高版本的问题:

Last-Modified如果后端返回和/或标头,OP 期望的行为是清漆现在应该如何表现Etag

显然,一个对象只有在缓存中仍然存在时才能被刷新。这就是beresp.keep的用途。它延长了对象在 ttl 和宽限期过期后保存在缓存中的时间。请注意,如果缓存太小而无法保留所有对象的最大生命周期,则对象也会被 LRU 逐出。

在@maxschlepzig 的评论中,它可能是基于一个误解:

当一个对象不在缓存中但要被缓存时,varnish 不能转发客户端请求的条件标头(If-Modified-Since, If-None-Match),因为 304 响应不适合缓存(它没有正文并且仅与特定请求相关)。相反,对于这种情况,清漆会剥离到条件标头,以(可能)获得带有要放入缓存的对象的 200 响应。

如上所述,对于 ttl 过期后的后续后端请求,条件头是基于缓存的响应构造的。来自客户端的条件标头也不用于这种情况。

以上所有这些都适用于对象要被缓存的情况(Fetch,Hit-for-Miss(通过设置beresp.uncacheable创建))。

对于 Pass 和 Hit-for-Pass(由vcl_backend_response 中的 return(pass(duration)) 创建),客户端条件标头被传递到后端。

于 2022-02-23T10:05:58.667 回答