如何动态设置 varnish 响应 TTL?

如何动态设置 varnish 响应 TTL?

我的 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

https://github.com/varnishcache/varnish-cache/blob/master/doc/sphinx/users-guide/increasing-your-hitrate.rst

相关内容