【发布时间】:2021-07-12 10:45:00
【问题描述】:
我正在尝试创建一个 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 也会被缓存并且永远不会改变?
【问题讨论】:
-
您需要这个还是使用 Fastly-Debug 就足够了? integralist.co.uk/posts/fastly-varnish/#fastly-debug
-
了解 Fastly 的请求流程如何工作 (developer.fastly.com/learning/vcl/using) 可能很有用,因为它有助于解释为什么在 vcl_hit 中设置 beresp 没有意义。此外,我建议阅读 Fastly 的集群模型 (developer.fastly.com/learning/vcl/clustering),因为这将有助于理解为什么在某些 vcl 子例程中设置的 HTTP 标头会消失或无法正确保存数据。我在这里写过关于集群和添加“面包屑”标题(以及更多)的文章:integralist.co.uk/posts/fastly-varnish/#breadcrumb-trail)
-
我还建议使用fiddle.fastlydemo.net 来创建简化的测试用例以更轻松地验证。
-
re: 避免 null 你可以使用
if()三元语法:set resp.http.X-Fastly-Age = if(resp.http.X-Fastly-Age, resp.http.X-Fastly-Age, "") " " server.datacenter ":" obj.entered;或者你可以将它与变量声明一起使用,如果你更喜欢避免内联条件,这会更冗长:@987654343 @
标签: varnish varnish-vcl fastly