心有多大舞臺便有多大

          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 閱讀(5607) 評論(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頭中設置一些參數,也可以達到優化的目的.  回復  更多評論   

          主站蜘蛛池模板: 安泽县| 昌邑市| 小金县| 武鸣县| 新巴尔虎右旗| 土默特左旗| 定南县| 巴南区| 武汉市| 屏南县| 偏关县| 门头沟区| 资源县| 宁海县| 乌拉特中旗| 徐水县| 临西县| 福安市| 高尔夫| 漳州市| 肃宁县| 新蔡县| 山阳县| 科技| 九江市| 韶关市| 尖扎县| 武安市| 偏关县| 哈尔滨市| 临沭县| 河源市| 清远市| 南宁市| 昭通市| 梧州市| 温州市| 涿州市| 平武县| 云霄县| 鄯善县|