varnish缓存策略及缓存时间计算方法
当varnish收到这些内容之后,需要根椐一定的策略确定是否缓存它,如果需要缓存,还需要确定可以缓存的时间。
缺省是根椐后端返回的http状态码决定是否缓存。可以缓存的状态码如下:
200
203
300
301
302
410
404
if (beresp.http.Set-Cookie) {
set beresp.cacheable = false;
}
}
缺省的缓存时间计算方法如下:
(1).先根椐max-age确定缓存时间
看返回头中的Cache-Control头中,有没有指定s-maxage或max-age信息,另外,如果后端是一个缓存服务器,它还会指定一个age头,表明已经缓存过的时间,这样需要减去age头指定的时间,计算出对应的缓存时间。
CacheControl: max-age=86400
缓存时间:86400秒,即一天
CacheControl: max-age=86400
Age: 6400
缓存时间:86400 – 6400 = 80000秒
如果没有Date头
看expires指定的时间是否小于收到数据的时间
小于,表明从后端取得内容已经过期,缓存时间为0,不缓存
>=,则缓存到Expires指定的时刻再过期
如果有Date头
看Expires指定的时间是否小于Date指定的时间
小于,取到已经过期的内容,缓存时间为0,不缓存
>=,则看Date时间跟取到内容的时间差别(判断本机和后端的时钟差异)
小于clock_skew(缺省是10秒,管理员可以设置别的数值),以本机时间为准
看Expires指定的时间是否小于收到数据的时间
小于,表明从后端取得的内容已经过期,缓存时间为0,不缓存
>=,则缓存到Expires指定的时刻再过期
>= clock_skew,以后端的时间为准
缓存时间为Expires – Date的差值
set beresp.ttl = 1200s;
varnish内部有一个grace模式。当后端不可用,或者已经向后端发过更新请求的情况下,别的客户再请求这个对象时,会收到已经过期的版本,当然过期的时间在可接受的范围内。
varnish缺省可接受的过期时间范围是不超过10秒,可以修改params中的default_grace参数。修改这一数值,但这样的改法相当于改了全局的参数,适应于所有请求。
如果想只修改特定的url对应的对象的grace时间范围,则需要修改vcl配置,改两个地方。首先需要修改vcl_recv过程,在收到用户请求时指定可以接受过期对象的过期时间范围。其次需要修改vcl_fetch过程,从后端取到内容时,设置对象过期后还可以保留的时间,这样以便在过期后不会立即被后台线程清理掉。
set req.grace = 2m;
}
sub vcl_fetch {
set beresp.grace = 2m;
}
您可能感兴趣的文章:
varnish缓存策略及缓存时间计算方法
Varnish2.1.4配置缓存服务器
varnish反向代理缓存配置详解
Drupal7配合Varnish使用及整合drupal模块的详细教程
浅谈redis的缓存穿透和缓存失效的预防和解决
工作中的几个Drupal小问题记录总结
ASP.NET缓存的方法分析
asp.net 提高网站速度及缓存
varnish的VCL的配置详解
使用 PHP 实现 LRU 缓存淘汰算法