我的 php 脚本正在发送一个标头X_Cache_ttl: 1h
,在我的 varnish 配置文件中我有
sub vcl_fetch
{
if(beresp.http.X-Cache-ttl){
set beresp.ttl = beresp.http.X-Cache-ttl;
}
}
但是当我尝试启动它时,带有 set 命令的行导致 varnish 失败。
在日志中我得到
Expression has type STRING, expected DURATION
('input' Line 116 Pos 34) -- ('input' Line 116 Pos 56)
set beresp.ttl = beresp.http.X-Cache-ttl;
如何转换X-Cache-ttl
为持续时间以便可以动态设置 TTL?
我想避免使用类似以下的多个 if 语句
if(beresp.http.X-Cache-ttl == "60s") {
set beresp.ttl = 60s;
}
if(beresp.http.X-Cache-ttl == "1h") {
set beresp.ttl = 1h;
}
如果重要的话我在 centos 6 上使用 varnish 3.0.3。
答案1
这vmod_std
模块具有可以执行您所寻找的操作的功能。
import std;
在 VCL 的顶部,那么这应该可以工作:
sub vcl_fetch
{
set beresp.ttl = std.duration(beresp.http.X-Cache-ttl, 1h);
}
..1h
如果未设置标题,则为默认值。
答案2
根据 Varnish 文档,您可以使用Cache-Control
标题。
缓存控制
“Cache-Control”标头指示缓存如何处理内容。Varnish 关注 max-age 参数并使用它来计算对象的 TTL。
因此,请确保您发出带有 max-age 标头的“Cache-Control”标头。您可以查看 Varnish Software 的 Drupal 服务器发出的内容:
$ GET -Used http://www.varnish-software.com/|grep ^Cache-Control
Cache-Control: public, max-age=600