规则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。