原理简介


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


配置方法


Tomcat5.0以后的版本是支持对输出内容进行压缩的,使用的是gzip压缩格式 。


 


修改%TOMCAT_HOME%/conf/server.xml,修订节点如下:


[xhtml]  view plain  copy




    1. <Connector port="80" protocol="HTTP/1.1"   
    2. connectionTimeout="20000"   
    3. redirectPort="8443" executor="tomcatThreadPool" URIEncoding="utf-8"   
    4. compression="on"   
    5. compressionMinSize="50" noCompressionUserAgents="gozilla, traviata"   
    6. compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />



      从上面节点的属性可以看出,要使用gzip压缩功能,你需要在Connector节点中加上如下属性

      • compression="on" 打开压缩功能 
      • compressionMinSize="50" 启用压缩的输出内容大小,默认为2KB 
      • noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩 
      • compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些资源类型需要压缩



      测试方法


      启用了TOMCAT这个压缩功能后,我们如何来测试压缩是否有效呢?


      首先Tomcat是根据浏览器请求头中的accept-encoding来判断浏览器是否支持压缩功能,如果这个值包含有gzip,就表明浏览器支持gzip压缩内容的浏览,我们可以用两种方法来验证压缩是否生效。


      通过浏览器直接请求


             大家直接通过浏览器访问启用了压缩配置的服务器,然后通过抓包工具查看抓到的数据包,如果内容有很多你看不懂,就说明已经启用压缩功能了。


      通过程序模拟请求


      我们用httpclient写一个简单的测试程序,代码如下: 


      [java]  view plain  copy


      1. @Test  
      2. public void testGzip() {  
      3. new HttpClient();  
      4. new GetMethod("http://localhost/admin.jsp");  
      5. try {  
      6. "accept-encoding", "gzip,deflate");  
      7. "user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Alexa Toolbar; Maxthon 2.0)");  
      8. int result = httpClient.executeMethod(getMethod);  
      9. if (result == 200) {  
      10.                         System.out.println(getMethod.getResponseContentLength());  
      11.                         String html = getMethod.getResponseBodyAsString();  
      12.                         System.out.println(html);  
      13.                         System.out.println(html.getBytes().length);  
      14.                 }  
      15. catch (HttpException e) {  
      16.                 e.printStackTrace();  
      17. catch (IOException e) {  
      18.                 e.printStackTrace();  
      19. finally {  
      20.                 getMethod.releaseConnection();  
      21.         }  
      22. }


        执行这个junit程序,看看它所输出的是什么内容,如果输出的是一些乱码,并且打印内容的长度远小于实际的长度,就说明我们的配置生效了,通过一些其它验证工具,会发现网站浏览速度会明显提升。



      备注:如果发现内容没有被压缩,可以考虑调整compressionMinSize大小,如果请求资源小于这个数值,则不会启用压缩。


      刚刚给博客加了一个500px相册插件,lightbox引入了很多js文件和css文件,页面一下子看起来非常臃肿,所以还是把Gzip打开了。

      环境:Debian 6

      1、Vim打开Nginx配置文件

      vim /usr/local/nginx/conf/nginx.conf
      2、找到如下一段,进行修改
      gzip on;
      gzip_min_length 1k;
      gzip_buffers 4 16k;
      #gzip_http_version 1.0;
      gzip_comp_level 2;
      gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
      gzip_vary off;
      gzip_disable "MSIE [1-6]\.";

      3、解释一下

      第1行:开启Gzip

      第2行:不压缩临界值,大于1K的才压缩,一般不用改

      第3行:buffer,就是,嗯,算了不解释了,不用改

      第4行:用了反向代理的话,末端通信是HTTP/1.0,有需求的应该也不用看我这科普文了;有这句的话注释了就行了,默认是HTTP/1.1

      第5行:压缩级别,1-10,数字越大压缩的越好,时间也越长,看心情随便改吧

      第6行:进行压缩的文件类型,缺啥补啥就行了,JavaScript有两种写法,最好都写上吧,总有人抱怨js文件没有压缩,其实多写一种格式就行了

      第7行:跟Squid等缓存服务有关,on的话会在Header里增加"Vary: Accept-Encoding",我不需要这玩意,自己对照情况看着办吧

      第8行:IE6对Gzip不怎么友好,不给它Gzip了

      4、:wq保存退出,重新加载Nginx
      /usr/local/nginx/sbin/nginx -s reload
      5、用curl测试Gzip是否成功开启
      curl -I -H "Accept-Encoding: gzip, deflate" "//www.slyar.com/blog/"
      HTTP/1.1 200 OK
      Server: nginx/1.0.15
      Date: Sun, 26 Aug 2012 18:13:09 GMT
      Content-Type: text/html; charset=UTF-8
      Connection: keep-alive
      X-Powered-By: PHP/5.2.17p1
      X-Pingback: //www.slyar.com/blog/xmlrpc.php
      Content-Encoding: gzip页面成功压缩
      
      curl -I -H "Accept-Encoding: gzip, deflate" "//www.slyar.com/blog/wp-content/plugins/photonic/include/css/photonic.css"
      HTTP/1.1 200 OK
      Server: nginx/1.0.15
      Date: Sun, 26 Aug 2012 18:21:25 GMT
      Content-Type: text/css
      Last-Modified: Sun, 26 Aug 2012 15:17:07 GMT
      Connection: keep-alive
      Expires: Mon, 27 Aug 2012 06:21:25 GMT
      Cache-Control: max-age=43200
      Content-Encoding: gzipcss文件成功压缩
      curl -I -H "Accept-Encoding: gzip, deflate" "//www.slyar.com/blog/wp-includes/js/jquery/jquery.js"
      HTTP/1.1 200 OK
      Server: nginx/1.0.15
      Date: Sun, 26 Aug 2012 18:21:38 GMT
      Content-Type: application/x-javascript
      Last-Modified: Thu, 12 Jul 2012 17:42:45 GMT
      Connection: keep-alive
      Expires: Mon, 27 Aug 2012 06:21:38 GMT
      Cache-Control: max-age=43200
      Content-Encoding: gzipjs文件成功压缩
      curl -I -H "Accept-Encoding: gzip, deflate" "//www.slyar.com/blog/wp-content/uploads/2012/08/2012-08-23_203542.png"
      HTTP/1.1 200 OK
      Server: nginx/1.0.15
      Date: Sun, 26 Aug 2012 18:22:45 GMT
      Content-Type: image/png
      Last-Modified: Thu, 23 Aug 2012 13:50:53 GMT
      Connection: keep-alive
      Expires: Tue, 25 Sep 2012 18:22:45 GMT
      Cache-Control: max-age=2592000
      Content-Encoding: gzip图片成功压缩
      curl -I -H "Accept-Encoding: gzip, deflate" "//www.slyar.com/blog/wp-content/plugins/wp-multicollinks/wp-multicollinks.css"
      HTTP/1.1 200 OK
      Server: nginx/1.0.15
      Date: Sun, 26 Aug 2012 18:23:27 GMT
      Content-Type: text/css
      Content-Length: 180
      Last-Modified: Sat, 02 May 2009 08:46:15 GMT
      Connection: keep-alive
      Expires: Mon, 27 Aug 2012 06:23:27 GMT
      Cache-Control: max-age=43200
      Accept-Ranges: bytes