zhangpuego 2011-12-05
对于使用过squid的朋友来说,其存在相应的配置项,可忽略体积过大的对象被缓存。同样在varnish中也存在这种需求,但varnish并未提供现成的配置,需要我们手工配置VCL以实现。
原理:
对于静态文件,web服务器会在header中返回 Content-Length,标识出当前资源的体积大小(以字节计算),这也就是一些下载工具(浏览器,迅雷)在未下载完整个文件时,能显示其大小的关键所在。
知道这个原理之后,我们即可在varnish接收到后端的内容后进行适当判断,例如对超过1M的文件不缓存
if(beresp.http.Content-Length>1000000){
return(hit_for_pass);
}但这面这个配置是无法工作的,因为beresp.http.Content-Length被varnish视为是字符串,无法和整数进行对比,那么灵活变通一下,使用正则表达式过滤即可(超过7位数字,必然是大于等于1000000字节的),正确的配置如下:
在fetch事件配置段中加入以下代码:
if (beresp.http.Content-Length && beresp.http.Content-Length ~ "[0-9]{7,}"){
return(hit_for_pass);
}显然,varnish的这种方式灵活的配置方式,远超过squid。
下一个文章中,我会实例讲解利用varnish自带的工具,统计缓存命中最差的资源,以供网站性能优化之用,例如:
找出网站中访问量较大的404资源
找出没有正确设置缓存参数的资源
所有的这些,对网站的性能优化,对varnish的缓存命令率的提升,都有很强的理论指导价值。