如何在 Varnish 中使 URL 失效,在新版本被缓存之前,旧版本仍然可用

问题描述 投票:0回答:1

我想在某些情况下从后端将 Varnish 中的许多 URL 标记为无效,并让它们从缓存中提供服务,直到从后端获取新版本为止。根据我的理解和实验,使用 PURGE 确实从缓存中删除了完整的页面 - beresp.grace 似乎没有得到尊重。有什么好的做法可以实现这个目标吗?

varnish
1个回答
0
投票

您可以通过 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 秒的保留时间。

这意味着:

  • 过期时间后最多 30 秒,在进行异步获取时将提供内容过时的内容
  • 宽限期到期后最多 120 秒,该对象仍将保留以用于条件请求(
    If-None-Match
    If-Modified-Since
    )。
© www.soinside.com 2019 - 2024. All rights reserved.