首页 > 解决方案 > 基于数据中心和缓存状态的 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;

这会起作用,但问题是:

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

如何做到这一点?

编辑:

我设法在以下位置运行它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 也被缓存并且永远不会改变?

标签: varnishvarnish-vclfastly

解决方案


我将纯粹从 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;
    }
}

推荐阅读