首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > Apache >

java 配备Apache,Tomcat的gzip压缩功能

2012-10-30 
java 配置Apache,Tomcat的gzip压缩功能2) compressionMinSize2048 启用压缩的输出内容大小,这里面默认

java 配置Apache,Tomcat的gzip压缩功能
2) compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB
3) noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩?
4) compressableMimeType="text/html,text/xml" 压缩类型

我 这里的配置内容为:
?1????<Connector?port="80"?maxHttpHeaderSize="8192"
?2?????????????? maxThreads="150"?minSpareThreads="25"?maxSpareThreads="75"
?3?????????????? enableLookups="false"?redirectPort="8443"?acceptCount="100"
?4?????????????? connectionTimeout="20000"?disableUploadTimeout="true"?URIEncoding="utf-8"
?5????????????????? compression="on"?
?6?????????????? compressionMinSize="2048"?
?7?????????????? noCompressionUserAgents="gozilla,?traviata"?
?8?????????????? compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"??/>
?9??? <!--?Note?:?To?disable?connection?timeouts,?set?connectionTimeout?value
10???? to?0?-->
11???
12??? <!--?Note?:?To?use?gzip?compression?you?could?set?the?following?properties?:
13???
14?????????????? compression="on"?
15?????????????? compressionMinSize="2048"?
16?????????????? noCompressionUserAgents="gozilla,?traviata"?
17?????????????? compressableMimeType="text/html,text/xml"
18??? -->
19
一旦启用了这个压缩功能后,我们怎么来测试压缩是否有效呢?首先Tomcat是根据浏览器请求头中的accept-encoding来判断浏览器是否支持压缩功能,如果这个值包含有gzip,就表明浏览器支持gzip压缩内容的浏览,所以我们可以用httpclient来写一个这样的简单测试程序

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;


public class HttpTester {

public static void main(String[] args) throws Exception{
??HttpClient http = new HttpClient();
??GetMethod get = new GetMethod("http://www.dlog.cn/js/prototype.js");
??try{
??get.addRequestHeader("accept-encoding", "gzip,deflate");
??get.addRequestHeader("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Alexa Toolbar; Maxthon 2.0)");
??int er = http.executeMethod(get);
??if(er==200){
???System.out.println(get.getResponseContentLength());
???String html = get.getResponseBodyAsString();
???System.out.println(html);
???System.out.println(html.getBytes().length);
??}
}finally{
???get.releaseConnection();
}
}

}

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



二, 对于Apache而言,有两种情况
?
1)针对Apache2.0之前的版本,它原本是不支持 的,不过可以通过添加第三方的module_gzip模块来启用
?2)针对Apache2.0及之后的版本,Apache提供支持, 不过不叫gzip,而叫mod_deflate
下面就对Apache2.0及之后的版本作一个说明
1) 去掉#LoadModule headers_module modules/mod_headers.so前面的注释#,
2) 添加LoadModule deflate_module modules/mod_deflate.so
3) 在VirtualHost中添加
1??? <Location?"/">
2??????? SetOutputFilter?DEFLATE
3??????? BrowserMatch?^Mozilla/4?gzip-only-text/html
4??????? BrowserMatch?^Mozilla/4\.0[678]?no-gzip
5??????? BrowserMatch?\bMSIE?!no-gzip?!gzip-only-text/html
6??????? SetEnvIfNoCase?Request_URI?\.(?:gif|jpe?g|png)$?no-gzip?dont-vary
7??????? Header?append?Vary?User-Agent?env=!dont-vary
8??? </Location>
9
我这里面有一个完整的演示
?1#?加载deflate模块
?2LoadModule?headers_module?modules/mod_headers.so
?3LoadModule?deflate_module?modules/mod_deflate.so
?4<VirtualHost?*:80>
?5??? DocumentRoot?f:/apacheTest
?6??? <Location?"/">
?7??????? SetOutputFilter?DEFLATE
?8??????? BrowserMatch?^Mozilla/4?gzip-only-text/html
?9??????? BrowserMatch?^Mozilla/4\.0[678]?no-gzip
10??????? BrowserMatch?\bMSIE?!no-gzip?!gzip-only-text/html
11??????? SetEnvIfNoCase?Request_URI?\.(?:gif|jpe?g|png)$?no-gzip?dont-vary
12??????? Header?append?Vary?User-Agent?env=!dont-vary
13??? </Location>
14</VirtualHost>
关于 JavaScript的gzip静态压缩方法 传统的JS压缩(删除注释,删除多余空格等)提供的压缩率有时还是不尽不意,幸亏现在的浏览器都支持压缩传输(通过设置http header的Content-Encoding=gzip),可以通过服务器的配置(如apache)为你的js提供压缩传输,或是appfuse中使用的GZipFilter使tomcat也提供这种能力

现在的问题是这种动态的压缩会导致服务器CPU占用率过高,现在我想到的解决辨法是通过提供静态压缩(就是将js预先通过gzip.exe压缩好)

一.下面描述在tomcat中的应用

1.将prototype.js通过gzip.exe压缩保存成prototype.gzjs
2.设置header,我编写了一个简单的AddHeadersFilter来将所有以gzjs结尾的文件增加设置header Content-Encoding=gzip
web.xml中的配置
 <filter>  <filter-name>AddHeaderFilter</filter-name>  <filter-class>   badqiu.web.filter.AddHeaderFilter  </filter-class>  <init-param>   <param-name>headers</param-name>   <param-value>Content-Encoding=gzip</param-value>  </init-param> </filter> <filter-mapping>  <filter-name>AddHeaderFilter</filter-name>  <url-pattern>*.gzjs</url-pattern> </filter-mapping>


测试prototype.js是否正常的代码
<html><head><!-- type="text/javascript"不可少,有些浏览器缺少这个不能运行,具体已经忘记了 --><script src="prototype.gzjs" type="text/javascript"></script></head><body> <input id="username" name="username" value="badqiu"/><br /> <input id="email" value="badqiu@gmail.com"/><script> <!-- 测试prototype的方法是否正常--> alert($F('username'))</script></body></html>


在Apache httpd中可以直接通过在httpd.conf增加AddEncoding x-gzip .gzjs来映射.gzjs文件的header

二.相关压缩率数据
1. prototype.js 1.5.0_rc0原始大小56KB,未经任何处理直接使用gzip压缩为12KB,总压缩率79%
2. 通过js压缩工具压缩过的protytype.js为20KB,使用gzip压缩为10KB,总压缩率为83%
3. 实际项目中的多个js合并成的文件 439KB,直接通过gzip压缩为85KB,总压缩率81%
4. 439KB经过js压缩为165KB,再经过gzip压缩为65KB,总压缩率86%

基本上你都可以忽略js压缩工具的压缩率,直接使用gzip压缩

热点排行