2007年3月15日星期四

Web服务器内容的压缩输出

还在使用工具压缩js和css文件么?已经有些落伍啦,其实web服务器本身就具备压缩功能,可以把客户端所需要的内容压缩后再传输。当然这需要客户端浏览器支持压缩(通常是gzip方式),不过现在的主流浏览器比如ie、firefox、opera、safari都是支持滴。

首先可以用Real-Time Compression Check检查一下你现有的网站是否启用了压缩输出,如果没有,而且你使用的是iis系列web服务器的话,可以购买商业软件比如 ZipEnable来实现;如果使用的是apache服务器,那你有福了,使用mod_deflate就可以了。

mod_deflate的前身是mod_gunzip和mod_gzip,他们大多用于Apache 1.3分支,现在的Apache 2.x系列中,就被mod_deflate替代了,并且功能更加丰富。mod_gunzip和mod_gzip的区别在于:

mod_gunzip需要服务器上的文件本身就是压缩存储的,如果浏览器不支持压缩的话,再由web服务器解压后传输给客户端,否则直接读取压缩文件传给客户端。这样作的好处就是不占用cpu,并且大多数浏览器支持压缩,需要web服务器解压的不大。不过,碰到不支持压缩的机器人的话可就不好半喽。另外现在网站的内容大多是由程序动态生成的,在这种情况下mod_gunzip就没有用武之地了。

mod_gzip则不需要文件预先压缩存储,而是在浏览器支持压缩的情况下,把数据压缩之后再传给客户端。这样会牺牲一些cpu代价,但是适用于网站内容由程序动态生成的情况,并且gzip的速度也是非常得快,每次web请求的数据量也都不大,所以实际的cpu占用并不会太多。并且如果文件本身就是压缩了的,比如index.html.gz,那么这些文件会被直接输出,不用再压缩了(这样并不代表有了index.html.gz,就能替代index.html作为目录索引页) 。所以mod_gzip实际上覆盖和超越了mod_gunzip的功能。

mod_deflate的启用在ubuntu中很简单,"a2enmod deflate"就可以了,其他系统可以在httpd.conf中添加:

LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so

mod_deflate还需要配置一下,比如在httpd.conf中:


AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php application/x-javascript text/css

指定对html、txt、xml、php、js、css等mime类型的文件进行压缩,application/x-httpd-php和application/x-javascript是我加上的,不知道能否起作用。也可以按照文件扩展名或者浏览器类型进行压缩,还有更复杂的配置,可以查询 官方的手册

参考:
Compressed delivery
*.gz files shouldn't get "Content-Encoding: gzip" header
How To Save Traffic With Apache2's mod_deflate
Apache Module mod_deflate

Source:http://www.fwolf.com/blog/post/299