杨思为 | 我们一家

启用mod_deflate后代理缓存的解决方案

在之前一篇关于apache中进行mod_deflate配置的文章中,我们知道Apache2通过启用mod_deflate压缩模块来对网页组件进行压缩,可以显著的提高网页的下载速度,并为您节省大量的带宽。

当浏览器直接与服务器通信时,“mod_deflate配置”一文中的所介绍的配置都能很好的工作。浏览器直接与服务器通信时,Web服务器基于浏览器的Accept-Encoding来检查是否对响应进行压缩。也就是说,如果浏览器可以识别gzip格式的压缩文件,那么Web服务器就会发送经过压缩的网页内容给浏览器。反之,如果浏览器的Accept-Encoding中明确不能接受gzip格式的压缩文件,那么Web服务器就会发送不经过任何压缩的网页内容。

但是,当浏览器通过代理来发送请求时,情况就变得复杂了。

假设针对某个URL发送到代理的第一个请求来自一个不支持gzip的浏览器。这是到达代理的第一个请求,因此其缓存为空。代理会将请求转发到Web服务器。此时服务器的响应时未经过压缩的。这个没有压缩的响应被代理缓存起来并发送给浏览器。

现在,假设到达代理的第二个请求访问的是同一个URL,来自一个支持gzip的浏览器。代理会使用其缓存(未经压缩)的内容进行响应,这就失去了进行压缩的机会。如果顺序相反——第一个请求来自一个支持gzip的浏览器,而第二个请求来自一个不支持gzip的浏览器——情况就很严重。在这种情况下,代理的缓存中拥有一个压缩的内容,并将这个内容提供给后续的浏览器——不管它们是否支持gzip。

上边说了这么多,其实也就是说:仅仅按照“mod_deflate配置”一文中方法对网站内容进行压缩,在用户通过代理进行浏览网站时,有部分浏览器不支持压缩的浏览器就有可能看到一大堆乱码。

解决方案很简单:在Web服务器的响应中添加Vary头。Web服务器可以告诉代理根据一个或多个请求头来改变缓存的响应。

方法一:

通过apache的mod_headers模块设置Vary头

<IfModule mod_headers.c>
<FilesMatch “\.(gif|jpg|js|css|png|ico|swf)$”>
Header set Vary “Accept-Encoding”
</FilesMatch>
</IfModule>

方法二:

通过编程实现,例如PHP

<?php

Header(“Vary: Accetp-Encoding”);

?>

通过Vary的设置,可以使得代理缓存响应的多个版本,为Accept-Encoding请求头的每个值缓存一份。默认情况下,mod_gzip会向所有响应添加Vary: Accept-Encoding头,mod_deflate我不确定,所以我决定还是在apache的配置中增加上这一项。关于Vary有关的更多信息请参阅:http://www.w3.org/Protocols/rfc2616-sec14.html#sec14.44

以上资料主要出自《高性能网站建设指南》,结合自己的实践写的,希望对你有用。

作者:思为爸爸 分类:服务器管理 标签:, , 时间:2009年10月30日 1,108次浏览

当前位置:首页>开发研究>服务器管理>

上一篇:

下一篇:

  1. 没有任何评论。
  1. 没有任何引用。