使用Apache2的mod_deflate模块

今天看了精神奕奕的两篇文章:《Apache2 使用 mod_gzip 增進傳輸效能》《Apache2 使用 mod_deflate 增進傳輸效能》。看起来这是位WordPress前辈啊,05年初就开始接触了WordPress。

文章介绍了使用mod_gzip模块和mod_deflate模块压缩传输数据,提供传输性能的方法。WordPress本身支持gzip压缩输入,不过仅限于WordPress输出的页面,比如Blog页面以及WordPress后台页面等等。而其他地方,比如模版的js文件和CSS文件,因为这些文件不用被PHP引擎执行,没经过WordPress的处理,所以没有压缩。不过,K2模版的几个js是特例,因为他们都是做成PHP文件,包含了wp-blog-header.php文件,并在文件启动了gzip压缩。

我的服务器安装了mod_deflate模块,到Apache 2.2 文档里看了一下,找到mod_deflate模块的文档。精神奕奕的文章里说的DeflateCompressionLevel等命令都不能在.htaccess文件里使用,只能用AddOutputFilter命令[via]。于是在.htaccess文件里加上:

<ifmodule mod_deflate.c>
AddOutputFilter DEFLATE css js txt
</ifmodule>

这样,当传输以css,js,txt为扩展名的文件时,Apache将使用mod_deflate模块对其进行压缩后再传输。这三种文件都是文本格式的,压缩起来效果明显。还有html和xml文件也可以压缩,不过我的网站上基本没有这两种文件。Apache应该是按照最终要读取的文件的扩展名来判断的,刚才关了WordPress的gzip压缩,然后加上了在.htaccess文件里加上了html,发现我的Blog文章页面并没有被压缩。而这种压缩是在PHP等脚本解析程序执行完了之后才进行的,如果WordPress没有gzip压缩功能,倒是可以利用mod_deflate来对页面进行压缩,hoho

测试了一下,K2自带的style.css文件,未启用前Content-Length是15914字节,跟文件大小一致,启用后Content-Length只有4415。WordPress 2.0.5的/wp-admin/wp-admin.css文件,原来大小是15047字节,启用DEFLATE后Content-Length只有3990。

这个效果还是很明显的,对于网络传输速度不太好的服务器还是有点用的。而默认压缩等级没法调,因为我用的是虚拟主机。现在也不知道该怎么看服务器的默认压缩等级,不过看精神奕奕的效果:启用前12911字节,启用后3342字节,大概效果也差不多。

Update:今天找DreamHost的资料,偶然间看到这篇《PHP中HTTP方式下的Gzip压缩传输方法举偶》说,在.htaccess文件里可以打开PHP的gzip压缩输入,方法是在.htaccess文件里加入下面两行:

php_flag zlib.output_compression on
php_value zlib.output_compression_level 2

这样不错,等于是给每个PHP程序开头加上了ob_start("ob_gzhandler");这条语句。查了一下,WordPress也是利用ob_start()函数来启动gzip压缩的。

翻了一下PHP文档-ob_gzhandler,zlib.output_compression和ob_gzhandler还是有区别的。zlib.output_compression是和PHP脚本解析程序并行的一个线程,当PHP输入时,这边读入,压缩,而已经压缩好的文档达到一定数量(默认是4k),它就向浏览器发送数据。而ob_gzhandler则是在PHP脚本执行完所有代码才把缓存好的输出文件进行压缩并传输给浏览器,所以相对慢一点,不过使用它可以在PHP程序里控制一些参数,比如压缩等级等等。.htaccess里用php_value zlib.output_compression 2048语句可以设置输出数据达到2k就传输。

压缩等级的调整有两种说法,不过懒得研究了,默认等级是6,890k的文件压缩出来的数据和最高的9级只差1k,而且9级需要更多的CPU时间,用默认的6级就可以了。

另外,有个Real-Time Compression Check工具,可以检测某个URL是否是压缩传输的。好像这家公司做IIS下的zip压缩程序,所以弄了这么个在线工具。只要输入你的地址,回车,就可以看到服务器类型、是否是压缩传输以及压缩前和压缩后的大小比较。大多数情况下html代码都能压缩到1/4~1/3,gzip压缩传输还是很不错的。

请留下您的评论: