【问题标题】:Fastly/Varnish response headers based on data center and cache status基于数据中心和缓存状态的 Fastly/Varnish 响应标头
【发布时间】: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.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 varnish-vcl fastly


【解决方案1】:

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

【讨论】:

  • For uncached objects, the value of the Age response header is always zero. 这实际上不是真的。如果 Varnish 之前有一个缓存,它已经设置了 Age 标头,它只会扩展它,所以它永远不会为零。这就是我想使用内部 Fastly obj.entered 标头在 Fastly varnish 中获取实际年龄的原因。
  • @Vojtěch 你是对的。我忘记了 Fastly 使用多个缓存层的事实。在那种情况下,我无法帮助你,因为我对 Fastly 不太熟悉。不过,如果您有更多 Varnish 问题,请随时与我联系。
猜你喜欢
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
相关资源
最近更新 更多