我以前没有在 Varnish 上尝试过这个。而且我必须承认,我上一次使用 Varnish 的经历要追溯到很久以前 - 版本 2.1.5 天!
我已将 varnish 6.x 设置为简单/基本的静态 http-cache。我已经从这个清漆中实现了我希望的大部分内容,然后我想到了将 cache-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'.
我尝试将 beresp.ttl 分配为 vcl_backend_response 中的标头变量:
set beresp.http.x-ttl = beresp.ttl
那也没有用。
让我想知道,这是否可能?如果是这样,如何实现?
从 Varnish 4 开始,后端和客户端逻辑被分割成不同的线程。这种分裂也反映在 VCL 中。
在 Varnish 的客户端,你有像
req
和resp
访问请求和响应信息的对象。当您必须访问后端时,该req
对象将用于构建bereq
对象并将响应存储在beresp
对象中。正如您注意到的那样,
beresp
上下文在 中不可用vcl_deliver
,因为交付阶段发生在客户端。这就是为什么最好将
X-TTL
标头设置在后端。这是执行此操作的 VCL 代码: