Read Original article: 利用Header机制隐掉Vary,提高Web缓存的命中率 via 车东[Blog^2].
HTTP 1.1的规范建议所有的请求输出都包含Vary Header,目的是针对对前端缓存服务器,增加针对Vary制定的各种Header类型进行不同的缓存处理,在浏览器规格复杂的情况下,不利于缓存的命中,所以要在被缓存的服务器上设置:
Header unset Vary
问题是这样被发现的:最近使用Apache 2.2的内存缓存mod_mem_cache机制进行后台静态文件加速。但是总是发现命中率很低,几乎是缓而不存,而用了mod_disk_cache后,前端缓存目录空间增加非常快,以至于经常需要删除文件,而删除文件的I/O损失超过了直接访问后台访问的加速所得。后台明明只有几M模板图片和CSS文件,为什么缓存空间上G而且命中率那么低呢?查看了一下缓存目录下的文件,Apache的前端磁盘缓存就会根据浏览器除了针对内容的.data文件和.header文件外还有一个.vary目录:
Jqyw8OvBIlgaef7Zb8lQ.data
Jqyw8OvBIlgaef7Zb8lQ.header
Jqyw8OvBIlgaef7Zb8lQ.header.vary/
当遇到和原有Vary不同的Header时,会在 header.vary目录下生成更多的缓存;从Apache的讨论组上看原因就是IE的AcceptEncoding请求头信息里增加了一个空格;
IE : Accept-Encoding: gzip, deflate
Firefox: Accept-Encoding: gzip,deflate
于是按照Fernando的方法,将后台的Vary Header禁掉了。缓存空间立刻停止了增长,也不再有Vary AcceptEncode 头输出了,这个头信息可能是后台使用压缩模块造成的吧;
记录一个调试缓存缓存用命令行看Header输出的方法:
用curl -I 查看HTTP头信息;
查看缓存后输出结果:
curl -I http://www.example.com/foo.bar
查看缓存前的服务器输出:
curl -I -H "Host: www.example.com" http://ip.address.of.example/foo.bar

发表评论