规则4 压缩组件

1. 压缩是通过浏览器发送Accept-Encoding头和服务器响应Content-Encoding完成的。

 

2. 压缩什么

    很多网站会压缩其HTML文档,实际上压缩脚本和样式表也是非常值得做的(还包括XML和JSON在内的文本响应)。图片和PDF不应该被压缩,因为他们本来就被压缩了,再压缩只会浪费CPU资源。

    根据经验通常对大于1kb或2kb的文件进行压缩,mod_gzip_minimun_file_size指令会控制着希望压缩的文件的最小值,默认值为500B。

 

3. 配置

    a. 一般压缩方法有gzip和deflate,但gzip支持的浏览器最多,并且压缩效果也较好;

    b. Apach 1.3 mod_gzip

        mod_gzip_on   启用mod_zip

        mod_gzip_item_include  mod_gzip_item_exclude  基于文件类型、MIME类型、用户代理等定义哪些要压缩

        许多web主机服务都默认为text/html打开了mod_gzip

        mod_gzip_item_include   file   \.js$

    mod_gzip_item_include   file   ^application/x-javascript$

        mod_gzip_item_include   file   \.css$

        mod_gzip_item_include   file   ^text/css$

        gzip命令行工具支持控制压缩程度,可以在CPU和数据大小上取舍,但是mod_gzip没有相关的配置指令。

        mod_gzip可以使用mod_gzip_can_negotiate和mod_gzip_update_static来将压缩过的内容自动保存在磁盘上,并在原内容发生变化时更新压缩过的内容。

        Apach 2.x mod_deflate

        其实还是用gzip来压缩的

        AddOutputFilterByType DEFLATE text/html text/css application/x-javascript

        DeflateCompressionLevel   控制压缩级别指令

 

4. 代理缓存

    由于使用同一代理的浏览器支持压缩不一样,会导致混乱:

    在web服务器的响应中添加Vary头,web服务器可以告诉代理根据一个或多个请求头来改变缓存的响应--缓存过滤器规则;(Vary:Accept-Encoding 默认情况下mod_gzip会自动添加)-------这样就会为根据不同的Accept-Encoding缓存多个版本相同组件,根据Accept-Encoding来改变代理缓存对浏览器的响应。

 

5.  边缘情形

    有些浏览器宣称支持gzip,实际存在缺陷:

    浏览器白名单方式(为已证实支持压缩的浏览器提供压缩)

    Apache 1.3 mod_zip可用mod_gzip_item_include中使用恰当的User-Agent之来指定

    mod_gzip_item_include reqheader "User-Agent: MSIE [6-9]"

    mod_gzip_item_include reqheader "User-Agent: Mozilla/[5-9]"

    Apache 2.x中使用BrowserMatch:

    BrowserMatch ^MSIE [6-9] gzip

    BrowserMatch ^Mozilla/[5-9] gzip

    若是再综合考虑边缘情形和代理缓存将十分复杂, 有以下几种考虑方案:

    a. Vary: Accept-Encoding,User-Agent, mod_gzip会自动将使用浏览器白名单的User-Agent添加到Vary头。

        代理不可能为所以URL缓存Accept-Encoding和User-Agent的全部组合。(User-Agent太多)

        使用对User-Agent HTTP头进行求值的过滤器规则将会导致完全禁用为响应包进行的缓存,因为这实际上破坏了代理缓存;

    b. 使用Vary:*或Cache-Control:private来禁用代理缓存;

    c. 权衡:只有拥有大量的、多变的用户群,能够应付较高的带宽开销,并享有高质量名声,压缩内容并使用Cache-Control:private,否则压缩内容并使用Vary:Accept-Encoding。

        

posted on 2013-04-12 18:25  BigPalm  阅读(184)  评论(0编辑  收藏  举报

导航