Varnish-如何在响应标头中设置 TTL?

Varnish-如何在响应标头中设置 TTL?

我之前没有在 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 +")";
}

相关内容