心有多大舞台便有多大

Embrace changes, pursue excellence, share niceness.

关于http gzip压缩的一点想法

今天在路上偶尔想到,既然js,html,图片等静态内容可以通过http gzip压缩的方式传输到浏览器(相对于普通的浏览过程HTML ,CSS,Javascript , Text ,它可以节省40%左右的流量),那用jsp,servlet等动态创建的内容是否也可以压缩传输呢?还有AJAX的请求内容是否也可以用gziap压缩传输?
带着这些问题在网上查了下资料
AJAX的请求可以通过在http request中增加一个头标识:accept-encoding,值为"gzip"的方式实现
servlet则可以通过配置一个filter来实现
针对Apache2.0之前的版本,可以通过添加第三方的module_gzip模块来启用
针对Apache2.0及之后的版本,可以通过mod_deflate启动


下面的一个链接详细介绍了apache,tomcat中的配置方法:
http://www.128kj.com/article/article5/DA6B1D7BCDE9DE999C34E7379E18B35A.htm?id=2746
http://blogger.org.cn/blog/more.asp?name=lhwork&id=21867

用tomcat 6的可以到下面的url参考:
http://tomcat.apache.org/tomcat-6.0-doc/config/http.html

在tomcat的server.xml的connector部分,把compression="force"选项加上,然后,就可以用下面的代码测试,我是在demo应用下放了个md5.js:

/**
 * Created at 2008-03-21.
 */
package com.demo.test.http.gzip;

import junit.framework.TestCase;

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

/**
 * @author pony

 * 如果有任何对代码的修改,请按下面的格式注明修改的内容.
 * 序号   时间       作者        修改内容
 * 1.  2008-3-21 pony created this class.
 *
 */
public class TestTomcatGzipConfigure extends TestCase {
 public void testGetGzipContentFromTomcat() throws Exception {
  HttpClient http = new HttpClient();
  GetMethod get = new GetMethod("http://192.168.66.128:8080/demo/md5.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();
  }
 }
}



posted on 2008-03-21 12:52 pony 阅读(5599) 评论(3)  编辑  收藏 所属分类: Java

评论

# re: 关于http gzip压缩的一点想法 2008-03-25 17:38 pony

网站性能优化的时候,一方面要把眼光放在服务器端的优化上,同时,也不要忘了在客户端浏览器的优化
例如,可以把一些渲染的逻辑放到客户端浏览器中用js实现.
另外,我记得曾跟一个朋友说,网站在很多方面其实就是一种用户行为艺术,应该更多的考虑用户的行为习惯.尽量把一些业务相关但与用户体验无关的操作用异步AJAX去实现.
另外,其实很多时候,性能的问题是由数据库访问不当造成的.  回复  更多评论   

# re: 关于http gzip压缩的一点想法[未登录] 2008-03-26 10:05 pony

今天看到一篇关于优化浏览熟读的文章,大意是:
1.一个典型的网页,是由一个 html 文件和内嵌的各类元素组成的,这些元素包括页面内的图片,css 文件,javascript 文件等等。每一个内嵌的元素在 HTTP 协议的层面上和那个 html 文件是没有区别的:也就是都需要浏览器去服务器上抓下来。一个早期典型的浏览器是这样实现的:当用户敲入网址之后,浏览器和服务器建立连接,请求这个 html 页面,然后边接收服务器发送的 html 页面,边解析,碰到内嵌元素,可以立即开第二条连接请求。另外,如果内嵌元素很多,他可能会开多条连接同时请求。当所有需要的元素都下载完毕之后,浏览器就会将页面画出来。这个过程就是最早期的 HTTP/1.0 协议所设想的浏览器实现。

2.由于上面的基于TCP的3次握手的通讯方式对于http数据传输来说存在极大的浪费,每个元素都需要单建一条连接就会导致网络上大量的都是 TCP 建立连接和断开连接的网络包.而且,TCP 连接寻找最优网络包大小的方法是,在 TCP 连接建立的初期,网络包的大小是很小的,根据网络状况,两端的程序才会逐步增大网络包的大小以适应带宽提高网络传输的效率。所以浏览器给服务器发请求,如果每发一个请求就关闭连接的话,那这个连接的数据传输很难达到带宽所能承载的速度。

3.基于这种种原因,HTTP/1.1 很快出来了,提出了持久连接(persistent connection)的概念,也就是说同一条 HTTP 连接,可以同时处理多个请求,同时用一定的机制保证各个请求之间的分离性。具体的操作过程是:服务器给浏览器发送回应之后,并不马上关闭连接;浏览器判断上一个请求的回应已经收完的情况下,可以在这同一个连接上发第二个请求。这种运作模式大大减少了网络包

4.持久连接可以进一步提速。这就是 pipelining 了。上面可以看到,浏览器需要等待持久连接里上一个请求的回应完全收完才能发送后面的请求。如果和服务器的连接比较慢,往往持久连接大部分时间都花在等待而非数据发送/接收上。pipelining 的意思是,浏览器可以在一个持久连接里一次给服务器发送多个请求,服务器在这个连接上依次回应这些请求。这种运作方式和浏览器缓存结合起来的时候会尤其有效果。比方,图片浏览过后会存在浏览器缓存中,再次请求的时候浏览器会对服务器说,我这里已经有这个图片的缓存了,修改时间是XXXX,如果服务器上这个图片在这之后没有修改过,就不用重发了

5.在firefox中如果修改pipelining的设置呢?
打开firefox后,在地址栏中输入:about:config,就可以看到firefox的默认参数设置了.然后查找pipelining,双击可以修改参数的配置.
network.http.pipelining true

详细内容可以参考下面的连接:
http://www.acfield.net/bbs/archiver/?tid-56887.html
  回复  更多评论   

# re: 关于http gzip压缩的一点想法[未登录] 2008-03-27 14:27 pony

参考http://www.91linux.com/html/article/program/php/20071221/9291.html
可以看到更多的关于http头信息,通过在http头中设置一些参数,也可以达到优化的目的.  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: