您的位置:首页 > 运维架构 > Tomcat

给Tomcat,Apache,IIS配置gzip压缩功能

2010-04-21 21:36 375 查看
HTTP压缩(也就是gzip压缩了)可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML,CSS,Javascript,Text,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP,JSP,ASP,Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人。

在网上搜寻了下,做个记录,学习学习。

先知识普及下

一、关于gzip
gzip是一个网页领域的压缩标准,GNUZip格式。它通过向客户端浏览器发送gzip格式的压缩格式(通常能达到50%的压缩率以上),然后客户端浏览器对接收到的压缩格式进行解压缩,以达到减少网页访问打开时间,优化网站性能的目的。。l-本文来自http://spyrise.org/blog/-Qzf。

gzip压缩是很多服务器软件,如Apache,nginx,IIS等的标准配置。gzip更是绝大多数客户端浏览器支持的基本功能。b带CY-本文来自http://spyrise.org/blog/-带l#xnxSz。

开启gzip功能,会占用一定服务器的CPU。同时gzip的对象是一些文本格式的文件,如html、htm、css、js等。大家用过WinZip或WinRAR的话,对一个Word文档压缩不了多少,但对一些文本文件的压缩率应该很大的,一般能达到30%左右,zip优化网站就是这个原理。

二.HTTP压缩工作原理
Web服务器处理HTTP压缩的工作原理如下:
1.Web服务器接收到浏览器的HTTP请求后,检查浏览器是否支持HTTP压缩;
2.如果浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名;
3.如果请求文件是HTML、CSS等静态文件,Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件;
4.如果请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件;
5.如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件;
6.如果请求文件是动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。
下面以2个图片来加深理解:

1.没使用gzip:



2.使用gzip后:



三、tomcat服务器开启gzip功能的方法
tomcat5.0以后的版本是支持对输出内容进行gzip格式的压缩的。该功能默认是关闭的,如果需要启用该功能,我们需要修改tomcat的配置文件server.xml,修改的方法是在server.xml的节点

处加上属性:compression=”on”,即

下面是tomcat5.5.20中的$tomcat_home$/conf/server.xml的原内容

1<Connectorport="80"maxHttpHeaderSize="8192"
2maxThreads="150"minSpareThreads="25"maxSpareThreads="75"
3enableLookups="false"redirectPort="8443"acceptCount="100"
4connectionTimeout="20000"disableUploadTimeout="true"URIEncoding="utf-8"/>
5<!--Note:Todisableconnectiontimeouts,setconnectionTimeoutvalue
6to0-->
7
8<!--Note:Tousegzipcompressionyoucouldsetthefollowingproperties:
9
10compression="on"
11compressionMinSize="2048"
12noCompressionUserAgents="gozilla,traviata"
13compressableMimeType="text/html,text/xml"
14-->


从上面的第8行内容可以看出,要使用gzip压缩功能,你可以在Connector实例中加上如下属性即可
1)compression=”on”打开压缩功能
2)compressionMinSize=”2048″启用压缩的输出内容大小,这里面默认为2KB
3)noCompressionUserAgents=”gozilla,traviata”对于以下的浏览器,不启用压缩
4)compressableMimeType=”text/html,text/xml” 压缩类型

对于某些文本文件比如:log、txt等文件,我们也可以让服务器采用gzip压缩传输,修改conf目录下web.xml,添加

<mime-mapping>
<extension>log</extension>
<mime-type>text/plain</mime-type>
</mime-mapping>

等,就可以指定压缩传输了。通常情况下,压缩传输能大幅度提高展示速度。

四,对于Apache而言,有两种情况
1)针对Apache2.0之前的版本,它原本是不支持的,不过可以通过添加第三方的module_gzip模块来启用

2)针对Apache2.0及之后的版本,Apache提供支持,不过不叫gzip,而叫mod_deflate
下面就对Apache2.0及之后的版本作一个说明
1)去掉#LoadModuleheaders_modulemodules/mod_headers.so前面的注释#,
2)添加LoadModuledeflate_modulemodules/mod_deflate.so
3)在VirtualHost中添加

1<Location"/">
2SetOutputFilterDEFLATE
3BrowserMatch^Mozilla/4gzip-only-text/html
4BrowserMatch^Mozilla/4/.0[678]no-gzip
5BrowserMatch/bMSIE!no-gzip!gzip-only-text/html
6SetEnvIfNoCaseRequest_URI/.(?:gif|jpe?g|png)$no-gzipdont-vary
7HeaderappendVaryUser-Agentenv=!dont-vary
8</Location>
9


这里有一个完整的演示

1#加载deflate模块
2LoadModuleheaders_modulemodules/mod_headers.so
3LoadModuledeflate_modulemodules/mod_deflate.so
4<VirtualHost*:80>
5DocumentRootf:/apacheTest
6<Location"/">
7SetOutputFilterDEFLATE
8BrowserMatch^Mozilla/4gzip-only-text/html
9BrowserMatch^Mozilla/4/.0[678]no-gzip
10BrowserMatch/bMSIE!no-gzip!gzip-only-text/html
11SetEnvIfNoCaseRequest_URI/.(?:gif|jpe?g|png)$no-gzipdont-vary
12HeaderappendVaryUser-Agentenv=!dont-vary
13</Location>
14</VirtualHost>


五、IIS6.0
下面的方法来源与51cto的一个贴

1)打开Internet信息服务(IIS)管理器,右击”网站”->”属性”,选择”服务”。在”HTTP压缩”框中选中”压缩应用程序文件”和”压缩静态文件”,按需要设置”临时目录”和”临时目录的最大限制”;



2)在Internet信息服务(IIS)管理器,右击”Web服务扩展”->”增加一个新的Web服务扩展…”,在”新建Web服务扩展”框中输入扩展名”HTTPCompression”,添加”要求的文件”为C:/WINDOWS/system32/inetsrv/gzip.dll,其中Windows系统目录根据您的安装可能有所不同,选中”设置扩展状态为允许”;







3)使用文本编辑器打开C:/Windows/System32/inetsrv/MetaBase.xml(建议先备份),找到Location=”/LM/W3SVC/Filters/Compression/gzip”,如果需要压缩动态文件,则将HcDoDynamicCompression设置为”TRUE”,并在HcScriptFileExtensions中增加您要压缩的动态文件后缀名,如aspx;如果需要压缩静态文件,则将HcDoStaticCompression和HcDoOnDemandCompression设置为“TRUE”,并在HcFileExtensions中增加您需要压缩的静态文件后缀名,如xml、css等;HcDynamicCompressionLevel和HcOnDemandCompLevel表示需要的压缩率,数字越小压缩率越低;

4)编辑完毕后保存MetaBase.xml文件;如果文件无法保存,则可能IIS正在使用该文件。打开”开始”->”管理工具”->”服务”,停止”IISAdminService”后,即可保存;

5)最后,重新启动IIS。可以到HTTP压缩测试网站验证结果。

六、测试gzip压缩功能是否正确开启:
测试的方法很简单,只要用firefox的firebug插件里的网络监控功能,看看下载js文件的体积是否有明显减少就知道了(测试前最好清下浏览器的缓存)。
另外还可以用httpclient来写一个测试程序(以下内容摘自java自由人):
一旦启用了这个压缩功能后,我们怎么来测试压缩是否有效呢?首先Tomcat是根据浏览器请求头中的accept-encoding来判断浏览器是否支持压缩功能,如果这个值包含有gzip,就表明浏览器支持gzip压缩内容的浏览,所以我们可以用httpclient来写一个这样的简单测试程序

/**
*HTTP客户端测试类
*@authorliudong
*/
publicclassHttpTester{

/**
*@paramargs
*/
publicstaticvoidmain(String[]args)throwsException{
HttpClienthttp=newHttpClient();
GetMethodget=newGetMethod("http://www.dlog.cn/js/prototype.js");
try{
get.addRequestHeader("accept-encoding","gzip,deflate");
get.addRequestHeader("user-agent","Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.0;AlexaToolbar;Maxthon2.0)");
inter=http.executeMethod(get);
if(er==200){
System.out.println(get.getResponseContentLength());
Stringhtml=get.getResponseBodyAsString();
System.out.println(html);
System.out.println(html.getBytes().length);
}
}finally{
get.releaseConnection();
}
}
}


执行这个测试程序,看看它所输出的是什么内容,如果输出的是一些乱码,以及打印内容的长度远小于实际的长度,那么恭喜你,你的配置生效了,你会发现你网站的浏览速度比以前快多了。

ps:对于一下支持php的虚拟主机,可以用下面的方法测试服务器是否支持gzip

<?php
if(extension_loaded('zlib')){ob_start('ob_gzhandler');}
header('Content-type:text/html;charset=utf-8');
echo'如果您能看到这行文字就表示你的服务器支持gzip如果显示不了,就不支持。';
if(extension_loaded('zlib')){ob_end_flush();}
?>


七、一个在线gzip压缩网页的网站
http://www.gidnetwork.com/tools/gzip-test.php,大家在服务器使用gzip功能前,可以先使用这个网站把自己的页面进行gzip压缩,看能压缩多少,好有个感性的认识,用法很简单,输入要测试的页面,再点“check”按钮就OK了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: