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.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;
}
}
推荐阅读
- ruby - ruby:传递活动记录对象的数字 id 还是对象本身更好?
- python - 如何将单词分配给列表中的值?
- git - “添加纱线”后出现“权限被拒绝”错误的原因是什么?
- r - 使用 purrr 将字符向量折叠成字符串
- mysql - mysqld.exe:表'.\mysql\db'被标记为崩溃,应该修复
- powershell - Powershell:使用重命名项格式化文件名中的数字?
- angular - Angular DI 服务 - 显示属性
- jhipster - 使用 Kafka 部署单体应用的最简单方法是什么?
- python-3.x - 为什么谷歌视频智能的输出不是 JSON 格式
- java - 当 JButton 被按下时,JPanel 在 JFrame 中改变形状/位置。为什么?