更改 Varnish 中陈旧响应的缓存控制指令

Change cache control directive for stale responses in Varnish

这是我第一次尝试 Varnish。

我们注意到我们的 CDN 没有进行任何请求合并,因此作为实验,我可以试用 Varnish。

但是,当提供陈旧的内容时,我似乎无法弄清楚如何修改响应 headers。

图像如下 vcl 并且所有后端响应都将 max-age=60, public, s-maxage=600 作为 cache-control 指令。

sub vcl_backend_response {
    set beresp.grace = 3600s;
    return (deliver);
}

当我:

第二次访问 /foo 时,我会立即收到(陈旧的)回复。但是,我不希望它再具有相同的 cache-control 指令,因为那样我的 CDN 将继续为这个陈旧的响应提供另外 10 分钟的服务。

是否可以将陈旧内容的 cache-control 指令更改为 max-age=0, public, s-maxage=10

这是您需要修改 Cache-Control header 以获取陈旧内容的 VCL 代码:

vcl 4.1;

sub vcl_deliver {
    //set resp.http.x-ttl = obj.ttl;
    //set resp.http.x-grace = obj.grace;
    if(obj.ttl <= 0s && obj.grace > 0s ) {
        set resp.http.Cache-Control = "max-age=0, public, s-maxage=10";
    } 
}

If you want to debug the process, just uncomment the 2 lines and look for the x-ttl and x-grace response headers to see the remaining values for both timers.

虽然您可以通过在 VCL 中设置 beresp.grace 来控制陈旧性,但您也可以通过 Cache-Control header 中的 stale-while-revalidate 指令来设置陈旧性。

这是一个例子:

Cache-Control: max-age=60, public, s-maxage=600, stale-while-revalidate=3600

这将允许浏览器缓存 1 分钟,允许中间服务器缓存 10 分钟,并在重新验证过时内容时设置允许的 1 小时陈旧时间。