我之前没有在 Varnish 上尝试过这个。我必须承认我上次使用 Varnish 还是很久以前——2.1.5 版的时候!
我已经将 varnish 6.x 设置为简单/基本静态 http 缓存。我已经从这个 varnish 中实现了大部分我想要的功能,然后我想到将缓存 ttl 信息显示为响应标头。在这里,我遇到了障碍。我肯定做错了。可能 vcl_delivery 可能无法获取 beresp.ttl。我不确定。这是我添加到 vcl_deliver 的内容
set resp.http.X-TTL = "TTL (" + beresp.ttl +")";
我收到编译错误:
Mar 19 07:05:41 varnishd[55516]: Message from VCC-compiler:
Mar 19 07:05:41 varnishd[55516]: ('/etc/varnish/default.vcl' Line 97 Pos 40) -- (Pos 49)
Mar 19 07:05:41 varnishd[55516]: set resp.http.X-TTL = "TTL (" + beresp.ttl +")";
Mar 19 07:05:41 varnishd[55516]: ---------------------------------------##########------
Mar 19 07:05:41 varnishd[55516]: Not available in method 'vcl_deliver'.
我尝试在 vcl_backend_response 中将 beresp.ttl 分配为标头变量:
set beresp.http.x-ttl = beresp.ttl
那也不起作用。
我很好奇,这可能吗?如果可以,如何实现?
答案1
从 Varnish 4 开始,后端和客户端逻辑被拆分成不同的线程。这种拆分也反映在 VCL 中。
在 Varnish 的客户端,您可以使用req
和等对象resp
来访问请求和响应信息。当您必须访问后端时,req
将使用该对象来构建bereq
对象,并将响应存储在该beresp
对象中。
正如您所注意到的,beresp
上下文不可用vcl_deliver
,因为交付阶段发生在客户端。
这就是为什么最好X-TTL
在后端设置标题。
以下是执行此操作的 VCL 代码:
sub vcl_backend_response {
set beresp.http.X-TTL = "TTL (" + beresp.ttl +")";
}