笔记 by 车东

利用Header机制隐掉Vary,提高mod_cache缓存的命中率

· 缓存|Cache

HTTP 1.1的规范建议所有的请求输出都包含Vary Header,目的是针对对前端缓存服务器,增加针对Vary制定的各种Header类型进行不同的缓存处理,在浏览器规格复杂的情况下,不利于缓存的命中,所以要在被缓存的服务器上设置:

问题是这样被发现的:最近使用Apache 2.2的内存缓存mod_mem_cache机制进行后台静态文件加速。但是总是发现几乎是只代理而不缓存,而内存缓存模式又没有统计工具查看缓存内容和命中率。转为用mod_disk_cache后,前端缓存目录空间增加非常快,以至于经常需要删除文件,而删除文件的I/O损失超过了直接访问后台访问的加速所得。后台明明只有几M模板图片和CSS文件,为什么缓存空间上G而且命中率那么低呢?查看了一下缓存目录下的文件,Apache的前端磁盘缓存就会根据浏览器除了针对内容的.data文件和.header文件外还有一个.vary目录,而这个vary目录下又会按照顶级的cache规则再mapping出2级目录来,目录节点个数过多造成磁盘空间的浪费:

另外一个配置优化是不要启用后台的Expires Header;

记录一个调试缓存缓存用命令行看Header输出的方法: 用curl -I 查看HTTP头信息; 查看缓存后输出结果: curl -I http://www.example.com/foo.bar 查看缓存前的服务器输出: curl -I -H “Host: www.example.comhttp://ip.address.of.example/foo.bar

[chedong]$ curl -I http://public.blogbus.com/rss/xianguo.png HTTP/1.1 200 OK Date: Sat, 12 Apr 2008 07:10:01 GMT Server: Apache/2.2.8 (Unix) Last-Modified: Mon, 28 Jan 2008 03:34:55 GMT Accept-Ranges: bytes Content-Length: 1353 Cache-Control: max-age=20736000 Expires: Mon, 08 Dec 2008 06:27:41 GMT Node: B01-AD-01 Age: 2540 Content-Type: image/png

更多参考: mod_cache:mod_disk_cache实现相对较成熟;

W3上关于HTTP Vary Header的讨论: 对于Proxy是不适合用Vary Header的

对于删除过大的磁盘缓存目录: