Varnish 不对不常请求的缓存进行 origin 调用

Varnish not making origin call for infrequently requested cache

我注意到 Varnish 6.5 上的这种行为,如果客户端不经常请求请求,它不会根据 max-age 缓存控制源响应进行后端调用。

以下是我看到的每 1 秒请求一次缓存的预期行为。它有 20 秒 max-age cache-control header 来自 origin:

Request 1:
HTTP/2 200
date: Tue, 20 Jul 2021 02:02:02 GMT
content-type: application/json
content-length: 33692
server: Apache/2.4.25 (Debian)
x-ua-compatible: IE=edge;chrome=1
pragma:
cache-control: public, max-age=20
x-varnish: 1183681 1512819
age: 17
via: 1.1 varnish (Varnish/6.5)
vary: Accept-Encoding
x-cache: HIT
accept-ranges: bytes

Request 2:
HTTP/2 200
date: Tue, 20 Jul 2021 02:02:04 GMT
content-type: application/json
content-length: 33692
server: Apache/2.4.25 (Debian)
x-ua-compatible: IE=edge;chrome=1
pragma:
cache-control: public, max-age=20
x-varnish: 891620 1512819
age: 19
via: 1.1 varnish (Varnish/6.5)
vary: Accept-Encoding
x-cache: HIT
accept-ranges: bytes

Request 3:
HTTP/2 200
date: Tue, 20 Jul 2021 02:02:05 GMT
content-type: application/json
content-length: 33692
server: Apache/2.4.25 (Debian)
x-ua-compatible: IE=edge;chrome=1
pragma:
cache-control: public, max-age=20
x-varnish: 1183687 1512819
age: 20
via: 1.1 varnish (Varnish/6.5)
vary: Accept-Encoding
x-cache: HIT
accept-ranges: bytes

Request 4:
HTTP/2 200
date: Tue, 20 Jul 2021 02:02:06 GMT
content-type: application/json
content-length: 33692
server: Apache/2.4.25 (Debian)
x-ua-compatible: IE=edge;chrome=1
pragma:
cache-control: public, max-age=20
x-varnish: 854039 1183688
age: 1
via: 1.1 varnish (Varnish/6.5)
vary: Accept-Encoding
x-cache: HIT
accept-ranges: bytes

您可以看到上面的请求 #4 发出了一个新的原始请求,缓存请求 ID 为 1183688。

现在,如果我等待很长时间并发出相同的请求,缓存年龄很旧,清漆不会发出原始请求来缓存新的 object:

Request 5 after a while:
HTTP/2 200
date: Tue, 20 Jul 2021 02:10:08 GMT
content-type: application/json
content-length: 33692
server: Apache/2.4.25 (Debian)
x-ua-compatible: IE=edge;chrome=1
pragma:
cache-control: public, max-age=20
x-varnish: 1512998 1183688
age: 482
via: 1.1 varnish (Varnish/6.5)
vary: Accept-Encoding
x-cache: HIT
accept-ranges: bytes

我想我可以从原点开始添加 Expires header,但要寻找解释为什么如果请求不频繁,varnish 会以这种方式运行。谢谢

Varnish 中的 TTL header 优先级

Varnish 会检查 max-age 指令,但可能还有其他因素会导致 TTL 成为意外值。

这是 TTL 优先级:

  1. 检查 Cache-Control header 的 s-maxage 指令。
  2. 当没有 s-maxage 时,Varnish 会寻找 max-age 来设置它的 TTL.
  3. 当没有返回 Cache-Control header 时,Varnish 将使用 Expires header 来设置它的 TTL
  4. 当上述none适用时,Varnish将使用default_ttl运行时参数作为TTL值。它的默认值为 120 秒.
  5. Varnish 才会进入vcl_backend_response,让你改变TTL
  6. VCL 中使用 set beresp.ttl 设置的任何 TTL 都将占上风,无论是否设置任何其他值通过响应 headers.

您的具体情况

弄清楚发生了什么的最好方法是 运行 varnishlog 并为要跟踪的 URL 添加过滤器。

主页示例如下:

varnishlog -g request -q "ReqUrl eq '/'"

输出会非常冗长,但会包含您需要的所有信息。

特别感兴趣的标签是:

请同时查看您的 VCL 并检查 TTL 是否被 set beresp.ttl = 更改。

有什么需要我帮你的

总而言之,如果您需要进一步的帮助,请提供您的完整 VCL,以及 varnishlog 导致您出现意外行为的交易的摘录。

根据这些信息,我们会很清楚发生了什么。