鉴于互联网上的宽带有限,网络管理人员任何旨在加速接入速度的努力都是有价值的。其中的一个方法就是通过HTTP压缩技术实现接入速度的加速,它通过减少在服务器和客户端之间传输的数据量,显著地提高网站的性能。数据压缩本身并不新鲜。但是,这种方法的特色在于对服务器到客户端之间的数据压缩是实时的,很少有用户知道这种方法。
HTTP压缩技术,无需客户端配置,它是一种最为简便的提高网络速度的方法。本文旨在讨论这种技术是如何工作的?其优点是什么以及如何实现在Apache和IIS上的数据压缩?
为何要压缩?
绝大多数的用户对压缩技术的了解来自对下载的一大组文件进行压缩、解压和打开等体验,这种压缩技术也可以用于向客户端传输的数据的压缩方面,因为这是一种主动的处理过程,服务器可以减少网页发送的大小,从而降低用户下载的时间,最大效率地利用宽带。
通过压缩技术,你可以将HTML文件压缩到原来大小的一半。这样,把更多的时间留给了客户端,去下载更多带宽的工作量。这种压缩,是在不影响网站实际工作流程、网页设计和服务内务等情况下实现的,唯一改变的是信息传输的方式。
不过,这种方法也有他的限制。
适合压缩的文件类型
当然,并非所有的文件需要压缩。比如,已经压缩的文件诸如JPEG、GIF、PNG、电影和打包内容等不需要HTTP压缩过滤技术。对它们再次压缩将无法得到显著减小文件体积的效果。
同时,网站还有大量的文本内容诸如HTML、XML、CSS和RSS等,他们都需要进行压缩。压缩的程序取决于文件的类型,绝大多数的HTML文本文件压缩率为50%。而用了很格式的网页(例如用了大量的表格来规划页面)可以进一步压缩,最大可压缩到原有大小的三分之一。
幸运的是,大多数HTTP服务器都提供了选择对哪一类型文件进行压缩的能力,服务器就可以选择文件类型进行压缩,那些不适合压缩的文件会排除在外。
实现HTTP压缩
HTTP压缩,是服务器的功能,而浏览器也会自动地支持而无需对客户端进行另外的配置。要想启用服务器压缩,只需要简单的对服务器进行一些设置。
要启用HTTP压缩的设置, Apache、IIS6和IIS的更老版本的设置方法都不同。
Apache
Apache 2.0包含了mod_deflate模块,这个模块对服务器内容进行动态的Gzip压缩。这种压缩可以是对所有内容无差别的——对IE浏览器,所有的内容都是经过压缩的,或者是选择性的,仅压缩指定的MIME类型,MIME类型由HTTP应答头确定,这个HTTP头可以是由Apache自动生成或是由动态程序(例如CGI)的输出。
要实现内容的无差别压缩,可以在Apache配置文件中对整个站点或需要启用压缩的目录加入SetOutputFilter指示如下:
SetOutputFilter Deflate |
要启用对特定MIME类型内容的压缩,可以在配置文件中使用AddOutputFilterByType指示,例如下面这样:
AddOutputFilterByType DEFLATE text/html |
注意,所有被指定MIME类型输出都将被压缩,无论它是来自于一个静态的磁盘文件还是一个动态程序(如CGI或mod_perl)输出。
有些老的浏览器无法正确的处理压缩过的内容,这时可以用BrowserMatch指示来过滤掉特定的浏览器类型,你可以查看mod_deflate 帮助手册获取更详细的资料。
IIS 6
IIS 6包括了一个简便易用的内置压缩组件。由于是内置式的,它不是通过IISAPI接口,它的压缩速度极快,是IIS 5和更早版本IIS的第三方HTTP压缩组件的最佳替代品。压缩系统可以设置对动态(例如脚本输出仙鹤)和静态内容进行压缩,它也可以在目录中缓冲压缩信息,这样当再次访问以前访问过的内容时,无需再次进行压缩从而改善了动态和静态内容的访问性能。
为了实现在IIS 6中的HTTP压缩技术,用户打开网站的属性页面,编辑全局属性,切换到“服务”标签,在HTTP压缩选项中配置选择项。
缓冲的文件存储于临时目录中,默认的设置是IIS中的元数据目录的子目录下。该目录必须位于NTFS格式分区上,你可以设定缓冲区的大小或是设定为无限,我们建议最大可设置为该分区的两倍(这些数据还包括了动态脚本的输出内容)。
IIS5和IIS的更老版本
IIS5和IIS的更老版本没有内置压缩功能,但是,它们支持ISAPI过滤器。我们建议用户使用Port80的
ZipEnable。虽然也存在其它类似功能的产品,但它是少数微软特别推荐的产品之一,而且它与IIS 6兼容,通过配置IIS 6的设置,它可以将IIS6的HTTP压缩功能进一步在目录级别上进行进行控制。
服务器的性能表现
显然,对传输数据进行压缩需要一定的CPU时间,这种压缩过程可能会对网站造成不良的影响,因为选定的每个目标在发送前都必须进行压缩。这里IIS6领先了Apache一小步,它建立了一个缓冲区域,放压缩文件放在里面,这样对于那些被频繁访问的内容可以大大减少CPU压缩处理时间。但这不能完全避免实时在线压缩的需要,大量的动态的内容还是必须被在线压缩,而这些动态内容所需的缓存空间可能极其巨大。
如果可以节省50%的带宽而只牺牲网站不到10%的CPU时间。这样做是完全值得的,特别是对于那些按网络流量计费的企业来说更为划算。
浏览器的支持和动态内容
如今,绝大多数的现代浏览器支持压缩技术,但是,具体的压缩方式取决于浏览器。不过你无需对此担心,因为只有浏览器指示支持一种压缩方式时,Web服务器才会发送压缩内容。尽管如果,了解一下这种处理机制和不同浏览器支持的压缩类型仅是一件有意义的事。
浏览器在要求一个网址时,会把支持的压缩格式通过Accept-Encoding的HTTP头提交给服务器,Apache或其它Web服务器则从HTTP_ACCEPT_ENCODING环境变量读取这个信息,这个过程无需你人为干预,Apache在浏览器支持压缩的情况下会自动对发送的内容进行合适的编码。
下表列出了常见的浏览器和它们支持的编码类型。
浏览器 | 支持的编码 |
Firefox 1.0, Mozilla 1.x, Camino | gzip, deflate |
OmniWeb 5.x | bzip2, gzip, deflate |
Safari | gzip, deflate |
Internet Explorer | gzip, deflate |
“Identity”这个词有时会出现在浏览器支持的编码列表中,这个词的意思就是支持非压缩内容。所有的浏览器都会默认对它提供支持,不过有些没有特别列出。
如上所示,现代的浏览器都支持压缩技术。当发出URL请求时浏览器会自动提供支持的编码。如果你需要使用HTTP压缩技术,只需要对服务器端进行设置就足够了。
总结
使用HTTP压缩是一种简单易行的提高服务器性能和减少带宽消耗的方法,它也有潜在的不足,那就是增大了CPU的开销。但是相对于它带来的好处而言,这个开销是物有所值的。
而且,如果你发现它并没有带来想象中的服务器性能提升,要禁用它也非常简单。它没有改变过你的站点内容,改变的仅是数据传输的方式而已。
附注:
在运行微软Internet Information Services (IIS) 6.0的Windows Server 2003系统上,使用GNU zip(Gzip)进行压缩的静态文件可能会不可用或包含有来自Web服务器中其他文件的内容。如果出现这种情况,返回客户端的页面将会生成出错,而且还可能造成访问冲突的现象。
上述问题可能影响到“Outlook网络访问(OWA)”用户,并可能导致代码错误信息返回到OWA页面上。
微软已针对上述问题发布了修复补丁,其版本号为831464,大小为430 KB。该补丁对应微软第831464号知识库文章。
附注:
在运行微软Internet Information Services (IIS) 6.0的Windows Server 2003系统上,使用GNU zip(Gzip)进行压缩的静态文件可能会不可用或包含有来自Web服务器中其他文件的内容。如果出现这种情况,返回客户端的页面将会生成出错,而且还可能造成访问冲突的现象。
上述问题可能影响到“Outlook网络访问(OWA)”用户,并可能导致代码错误信息返回到OWA页面上。
微软已针对上述问题发布了修复补丁,其版本号为831464,大小为430 KB。该补丁对应微软第831464号知识库文章。
本文转自 张善友 51CTO博客,原文链接:http://blog.51cto.com/shanyou/75257,如需转载请自行联系原作者