【问题标题】:Change cache control directive for stale responses in Varnish更改 Varnish 中陈旧响应的缓存控制指令
【发布时间】:2022-02-14 21:46:46
【问题描述】:

这是我第一次尝试 Varnish。

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

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

如下图vcl 和所有后端响应都将max-age=60, public, s-maxage=600 作为缓存控制指令。

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

当我:

  • 访问/foo
  • /foo 上执行清漆软清除和后续 CDN(硬)清除
  • 再次访问/foo

当我第二次访问/foo 时,我会立即得到一个(陈旧的)回复。但是我不希望它再有相同的缓存控制指令,因为这样我的 CDN 将继续为这个陈旧的响应提供另外 10 分钟。

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

【问题讨论】:

    标签: varnish varnish-vcl


    【解决方案1】:

    这是您需要修改 Cache-Control 标头以获取陈旧内容的 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";
        } 
    }
    

    如果您想调试该过程,只需取消注释这两行并查找 x-ttlx-grace 响应标头以查看两个计时器的剩余值。

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

    这是一个例子:

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

    这将允许浏览器缓存一分钟,允许中间服务器缓存 10 分钟,并设置一个小时的允许过期时间,同时重新验证过时的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-07
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多