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 优先级:
- 检查
Cache-Control
header 的 s-maxage
指令。
- 当没有
s-maxage
时,Varnish 会寻找 max-age
来设置它的 TTL.
- 当没有返回
Cache-Control
header 时,Varnish 将使用 Expires
header 来设置它的 TTL。
- 当上述none适用时,Varnish将使用
default_ttl
运行时参数作为TTL值。它的默认值为 120 秒.
- Varnish 才会进入
vcl_backend_response
,让你改变TTL。
- 在 VCL 中使用
set beresp.ttl
设置的任何 TTL 都将占上风,无论是否设置任何其他值通过响应 headers.
您的具体情况
弄清楚发生了什么的最好方法是 运行 varnishlog
并为要跟踪的 URL 添加过滤器。
主页示例如下:
varnishlog -g request -q "ReqUrl eq '/'"
输出会非常冗长,但会包含您需要的所有信息。
特别感兴趣的标签是:
TTL
参见 https://varnish-cache.org/docs/6.5/reference/vsl.html#varnish-shared-memory-logging
BerespHeader
(特别是 Cache-Control
后端响应 header)
RespHeader
(特别是 Cache-Control
响应 header)
请同时查看您的 VCL 并检查 TTL 是否被 set beresp.ttl =
更改。
有什么需要我帮你的
总而言之,如果您需要进一步的帮助,请提供您的完整 VCL,以及 varnishlog
导致您出现意外行为的交易的摘录。
根据这些信息,我们会很清楚发生了什么。
我注意到 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 优先级:
- 检查
Cache-Control
header 的s-maxage
指令。 - 当没有
s-maxage
时,Varnish 会寻找max-age
来设置它的 TTL. - 当没有返回
Cache-Control
header 时,Varnish 将使用Expires
header 来设置它的 TTL。 - 当上述none适用时,Varnish将使用
default_ttl
运行时参数作为TTL值。它的默认值为 120 秒. - Varnish 才会进入
vcl_backend_response
,让你改变TTL。 - 在 VCL 中使用
set beresp.ttl
设置的任何 TTL 都将占上风,无论是否设置任何其他值通过响应 headers.
您的具体情况
弄清楚发生了什么的最好方法是 运行 varnishlog
并为要跟踪的 URL 添加过滤器。
主页示例如下:
varnishlog -g request -q "ReqUrl eq '/'"
输出会非常冗长,但会包含您需要的所有信息。
特别感兴趣的标签是:
TTL
参见 https://varnish-cache.org/docs/6.5/reference/vsl.html#varnish-shared-memory-loggingBerespHeader
(特别是Cache-Control
后端响应 header)RespHeader
(特别是Cache-Control
响应 header)
请同时查看您的 VCL 并检查 TTL 是否被 set beresp.ttl =
更改。
有什么需要我帮你的
总而言之,如果您需要进一步的帮助,请提供您的完整 VCL,以及 varnishlog
导致您出现意外行为的交易的摘录。
根据这些信息,我们会很清楚发生了什么。