问题描述
我正在尝试创建一个 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.entered
在vcl_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
它受到两件事的影响:
- 在第一次调用中获取
(null)
- 如果标头为空,有没有办法不添加标头? - 边缘时间 (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;
}
}