我想在某些情况下从后端将 Varnish 中的许多 URL 标记为无效,并让它们从缓存中提供服务,直到从后端获取新版本为止。根据我的理解和实验,使用 PURGE 确实从缓存中删除了完整的页面 - beresp.grace 似乎没有得到尊重。有什么好的做法可以实现这个目标吗?
您可以通过 purge VMOD 使用软清除。
它不会立即从缓存中删除对象,而是显式地使对象过期,并在异步获取新版本时使用宽限值来提供过时的内容。
这是完成它所需的代码:
vcl 4.1;
import purge;
acl purge {
"localhost";
"192.168.55.0"/24;
}
sub vcl_recv {
if (req.method == "PURGE") {
if (client.ip !~ purge) {
return (synth(405, "Method Not Allowed"));
}
return (hash);
}
}
sub vcl_hit {
if (req.method == "PURGE") {
call my_purge;
}
}
sub vcl_miss {
if (req.method == "PURGE") {
call my_purge;
}
}
sub my_purge {
set req.http.purged = purge.soft(0s,30s,120s);
if (req.http.purged == "0") {
return (synth(404));
} else {
return (synth(200, "Purged"));
}
}
此代码将提供一个入口点,使用
PURGE
请求方法使内容无效。为了避免未经授权的访问,定义了一个 ACL,其中包含 IP 地址、子网和主机名的白名单。
此示例将使内容过期,并添加 30 秒的宽限时间和 120 秒的保留时间。
这意味着:
If-None-Match
或 If-Modified-Since
)。