微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于数据中心和缓存状态的 Fastly/Varnish 响应头

如何解决基于数据中心和缓存状态的 Fastly/Varnish 响应头

我正在尝试创建一个 Varnish 响应标头,它可以帮助我调试缓存的状态。我想创建一个标头,它会显示请求经过的数据中心和对象的年龄。类似的东西:

X-Fastly-Age: VIE:2311s FRA:0s

这意味着对象缓存在 VIE 数据中心(屏蔽)和 FRA 边缘,它必须从 VIE 获取

第二个请求将返回如下内容

X-Fastly-Age: VIE:2311s FRA:133s

我试图设置这个:

set beresp.http.X-Fastly-Age = beresp.http.X-Fastly-Age " " req.http.edge-geo-datacenter ":" obj.entered;

这行得通,但问题是:

  • beresp.http 不能写成 vcl_hit
  • obj.enteredvcl_fetch 中不可用

所以基本上我似乎没有地方可以生成这个标题

如何实现?

编辑:

我设法在 vcl_deliver 中运行它:

set resp.http.X-Fastly-Age = resp.http.X-Fastly-Age " " server.datacenter ":" obj.entered;

得到:

> x-fastly-age: (null) DCA:0.001 FRA:0.001

它受到两件事的影响:

  1. 在第一次调用获取 (null) - 如果标头为空,有没有办法不添加标头?
  2. 边缘时间 (FRA) 永远不会改变并保持在 0.001。所以它似乎即使使用 obj.entered 也被缓存并且永远不会改变?

解决方法

我将纯粹从 Varnish 的角度来解决这个问题,因为我没有使用 Fastly 的经验。

Varnish 使用自动设置的 Age 标头来确定缓存中对象的年龄。

对于未缓存的对象,Age 响应标头的值始终为零。非零值相应地表示对象的年龄。

对于您获得的 null 值:我们可以使用 if/else 语句来解决该问题。

这里有一些 VCL 给你:

sub vcl_deliver {
    if(resp.http.X-Fastly-Age) {
        set resp.http.X-Fastly-Age = resp.http.X-Fastly-Age + " " + server.datacenter + ":" + resp.http.Age;
    } else {
        set resp.http.X-Fastly-Age = server.datacenter + ":" + resp.http.Age;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。