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 中:

<ifmodule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php application/x-javascript text/css
</ifmodule>

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

参考:

Update @ 2008-03-31

今天在 apache 2.2.4 下看到还需要增加以下辅助配置:

AddEncoding x-gzip .gz	
AddType text/html .gz

主要是让 apache 能够正确设置和处理 .gz 文件,至于 MultiViews 选项我看设不设没什么影响,参考:The nGzip File Compressor

5 thoughts on “Web服务器内容的压缩输出”

  1. 回楼上,这里我说的一些css和js压缩工具 多半是使用去除css和js文件当中的空格、TAB等方式来压缩的 即对机器阅读来讲没有改变,只是把方便人阅读的无用字符去掉了

    关于第二个winrar的问题,我想问你如果把一个html文件压缩成.rar文件放在web目录下 用户访问的时候会怎样呢? 而如果启用了mod_gzip或者mod_deflate之后,用户访问会看到被自动解开的html原文 而解压工作是由用户的浏览器来作的。

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *