Total Pageviews

Tuesday, 13 September 2016

Varnish中如何更灵活的编写vcl

Varnish本身的VCL语法是很简单的,功能也有限。不过可以完成比较好的固定要求的需求。
比如当我们要设置ttl为一个特定值时候,我们可以这么设置:
set beresp.ttl = 3600s
上面表示将ttl设置为3600s。
我们如果现在有一个这样的需求,
我希望每个页面有自己的缓存时间,而不是统一为3600s。这个时候该怎么做呢?
因为可能是跨平台的,所以,最直接想到的,自然是使用http协议头信息进行控制。
这里我是这么做的,首先我们定一个新的协议头,名为Cache-Span。我没有使用原有的Pragma和Cache-Control等,这些原有的头信息,主要是因为,这些事保留给控制浏览器使用的。另外,为了简化在Varnish中使用正则,自定义一个头,是最简单的方法。

在程序部分,我们也可以在一个信息要发送出去之前,加上该头信息。

对于Varnish来说,只需要解析头信息即可。于是又了下面的代码:
set beresp.ttl = beresp.http.Cache-Span;
如果你使用这段代码,当重启varnish的时候,会提示String不能转成Duration。
这下郁闷了吧。
不过,不担心,这里我们就要引入,我们这次要着重介绍的库vmod_std,该库,在varnish3.0中默认是一起发布的,所以,在使用时候,只要import std;即可了。
这里,贴一下该库的文档连接,应该还是很简单易用的。
https://www.varnish-cache.org/docs/trunk/reference/vmod_std.html

于是,我们就将代码变成了:
set beresp.ttl = std.duration(beresp.http.Cache-Span+"s",3600s);
这里文档上写的是3600,是错的。是需要加s的。

Ok,这样就满足了我们需求。如果有更复杂的需求,都可以采取类似的方案进行处理。

最后,附上,其他一些varnish常用的工具的文档说明的地址。
https://www.varnish-cache.org/docs/trunk/reference/index.html