利用GZIP壓縮網頁(Tomcat,apache,iis)各類方法總結


網站的訪問速度是由多個因素所共同決定的,這些因素例如應用程序的響應速度、網絡帶寬、服務器性能、與客戶端之間的網絡傳輸速度等等。其中最重要的一個因素是應用程序自己的響應速度,所以當你爲網站性能所苦惱時,你第一個須要着手進行處理的即是儘量的提高應用程序的執行速度,你可使用緩存或者是優化代碼的執行效率來提高應用程序的速度。
網頁壓縮是一項由 WEB 服務器和瀏覽器之間共同遵照的協議,也就是說 WEB 服務器和瀏覽器都必須支持該技術,所幸的是如今流行的瀏覽器都是支持的,包括 IE、FireFox、Opera 等;服務器有 Apache 和 IIS 等。
什麼是Gzip? Gzip是GNU zip的縮寫,它是一個GNU自由軟件的文件壓縮程序。最先由Jean-loup Gailly和Mark Adler建立,用於UNIX系統的文件壓縮。咱們在Linux中常常會用到後綴爲.gz的文件,它們就是Gzip格式的。現今已經成爲Internet上使用很是廣泛的一種數據壓縮格式,或者說一種文件格式。HTTP協議上的GZIP編碼是一種用來改進WEB應用程序性能的技術。大流量的WEB站點經常使用Gzip壓縮技術來讓用戶感覺更快的速度。這通常是指WWW服務器中安裝的一個功能,當有人來訪問這個服務器中的網站時,服務器中的這個功能就將網頁內容壓縮後傳輸到來訪的電腦瀏覽器中顯示出來。通常對純文本內容可壓縮到原大小的40%。
Gzip開啓後有什麼好處? 開啓Gzip後會在網頁數據傳輸以前,先使用Gzip壓縮後再傳輸給客戶端,客戶端接收以後由瀏覽器解壓顯示。這樣就會減少經過網絡傳輸的數據量,提升瀏覽的速度。  
Gzip Web壓縮工做原理 Web服務器處理HTTP壓縮的過程以下: 1. Web服務器接收到瀏覽器的HTTP請求後,檢查瀏覽器是否支持HTTP壓縮(Accept-Encoding 信息); 2. 若是瀏覽器支持HTTP壓縮,Web服務器檢查請求文件的後綴名; 3. 若是請求文件是HTML、CSS等靜態文件,Web服務器到壓縮緩衝目錄中檢查是否已經存在請求文件的最新壓縮文件; 4. 若是請求文件的壓縮文件不存在,Web服務器向瀏覽器返回未壓縮的請求文件,並在壓縮緩衝目錄中存放請求文件的壓縮文件; 5. 若是請求文件的最新壓縮文件已經存在,則直接返回請求文件的壓縮文件; 6. 若是請求文件是動態文件,Web服務器動態壓縮內容並返回瀏覽器,壓縮內容不存放到壓縮緩存目錄中。
下面是兩個演示圖:

未使用Gzip:
未使用Gzip
開啓使用Gzip後:
開啓使用Gzip後
讓咱們開始吧!
  • 1、Tomcat服務器
若是您的 WEB 應用程序是跑在 Tomcat 服務器下的,並且直接使用 Tomcat 所提供的 HTTP 服務,那建議你立刻動手,由於實在是太簡單了,你只須要在 server.xml 配置文件中給 HTTP Connector 增長一個 compression 的參數值爲 on 並重啓 Tomcat 服務器就馬上生效,配置以下:
<Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" compression="on"/>
Tomcat 採用的是 HTTP/1.1 的 GZIP 壓縮協議,它會根據瀏覽器送過來的請求中的 accept-encoding 值是否包含 gzip 來判斷瀏覽器是否支持 gzip 壓縮協議,若是瀏覽器支持就啓用 gzip 壓縮,不然就不進行任何壓縮處理。Tomcat 中還有另一個參數 compressableMimeType,這個參數能夠用來指定壓縮哪一種類型的內容,例如能夠指定該配置值爲:text/html,text/plain ,則只壓縮 contentType 爲 text/html 和 text/plain 的頁面,不過您最好也將 css 和 javascript 文件也算在壓縮的文件類型中,由於這二者的壓縮效果也十分的明顯。

2、Apache 服務器  在 apache 1.3 版本,你們經常使用 mod_gzip 對輸出內容進行壓縮,如今主流的瀏覽器都支持 gzip 解壓縮。在 apache2 下,這個模塊換名爲  mod_deflate ,對應的模塊文件名是mod_deflate.so下面咱們介紹在 Windows 和 Linux 操做系統下如何啓用並配置mod_gzip和mod_deflate模塊。 一、mod_gzip的啓用  若是服務器開啓了對Gzip組件的支持,那麼咱們就能夠在http.conf或.htaccess裏面進行定製,下面是一個.htaccess配置的簡單實例:
  • # mod_gzip:
  • <ifModule mod_gzip.c>
  •  mod_gzip_on Yes 
  • mod_gzip_dechunk Yes 
  • mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$ 
  • mod_gzip_item_include handler ^cgi-script$ mod_gzip_item_include mime ^text/.* 
  • mod_gzip_item_include mime ^application/x-javascript.* 
  • mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* 
  • </ifModule>
  二、mod_deflate的啓用
  1. # mod_deflate:
  2. <ifmodule mod_deflate.c>
  3.  DeflateCompressionLevel 6 #壓縮率, 6是建議值. 
  4. AddOutputFilterByType DEFLATE text/plain 
  5. AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css 
  6. AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE application/xhtml+xml
  7.  AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/rss+xml
  8.  AddOutputFilterByType DEFLATE application/atom_xml AddOutputFilterByType DEFLATE application/x-javascript
  9.  AddOutputFilterByType DEFLATE application/x-httpd-php AddOutputFilterByType DEFLATE p_w_picpath/svg+xml 
  10. </ifmodule>
三、對未開啓mod_gzip和mod_deflate模塊的虛擬主機的設置(如GoDaddy Deluxe Hosting – Linux) 
  GoDaddy Deluxe Hosting – Linux 空間不支持mod_gzip、mod_deflate模塊,若想經過GZIP壓縮網頁內容,能夠考慮兩種方式,開啓zlib.output_compression或者經過ob_gzhandler編碼的方式。 zlib.output_compression是在對網頁內容壓縮的同時發送數據至客戶端,ob_gzhandler是等待網頁內容壓縮完畢後才進行發送,相比之下godaddy使用後者效率更高,但須要注意的是,二者不能同時使用,只能選其一,不然將出現錯誤。   在默認狀況下,zlib.output_compression是關閉的,如需開啓需編輯php5.ini文件,加入如下內容:
  1. zlib.output_compression = On
  2.  zlib.output_compression_level = 6
  第2個參數的值從1到9,越大表明壓縮率越大,通常設爲6。Gzip功能會極輕微的加劇服務器負擔。 對於綁定了多個域名的 godaddy主機 ,只須要設置一次便可,就是主機的總的根目錄下的php5.ini。 將php5.ini上傳到FTP根目錄下,剩下的事請就是等待它生效,這可能須要一段時間,能夠經過phpinfo()函數檢測結果:
  1. Directive Local Value Master Value 
  2. zlib.output_compression On On 
  3. zlib.output_compression_level 6 6
當zlib.output_compression的Local Value和MasterValue的值同爲On時,表示已經生效,這時候訪問的PHP頁面(包括僞靜態頁面)已經GZIP壓縮了,經過Firebug或者在線網頁GZIP壓縮檢測工具可檢測到壓縮的效果。 若是須要使用ob_gzhandler,則需關閉zlib.output_compression,把php5.ini文件內容更改成:
  1. zlib.output_compression = Off 
  2. zlib.output_compression_level = -1
ob_gzhandler是GoDaddy官網推薦的用法,經過在PHP文件中插入相關代碼實現GZIP壓縮,如下是GoDaddy幫助中心所提到的:
GZIP Compression Smaller pages load faster, regardless of your Internet connection speed. You can make your pages smaller by compressing them with GZIP. For more information about GZIP and our hosting, see  Compressing Web Pages for Faster Load Times.
《Compressing Web Pages for Faster Load Times》文中提到,將如下PHP代碼加入到PHP文件頂部,便可實現GZIP壓縮。
 <?php if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start(); ?>
不論是zlib.output_compression仍是ob_gzhandler,都僅能對PHP文件進行GZIP壓縮,對於HTML、CSS、JS等靜態文件只能經過調用PHP的方式實現,能夠參照文章《 加速blog:GZIP壓縮傳輸你的文件 》中的「靜態文本調用PHP壓縮模塊實現GZIP壓縮效果」。 最後想說的是,如今主流的瀏覽器默認使用的是HTTP1.1協議,基本都支持GZIP壓縮,對於IE而言,假如你沒有選中其菜單欄工具->Internet 選項->高級->HTTP 1.1 設置->使用 HTTP 1.1,那麼,你將感覺不到網頁壓縮後的速度提高所帶來的快感!
通過個人測試,zlib.output_compression和ob_gzhandler這兩種方式,godaddy空間使用ob_gzhandler方式,訪問速度有明顯的提升,前者效率不好。另外,有一種傳說中沒嘗試過的方法。以下:  

ps:經測試下面方法中在linux空間起做用
給godaddy 開啓網頁GZIP壓縮,速度傳輸提高50%。godaddy默認是支持Gzip的,修改你的程序便可實現。 Win空間: web.config文件加入代碼:
<system.webServer> <urlCompression doStaticCompression="true" doDynamicCompression="true" /> </system.webServer>
Linux空間: .htaccess 加入代碼:
<ifmodule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-httpd-php application/x-javascript </ifmodule>

3、 IIS 服務器  
微軟的 IIS 服務器一樣也是目前用得最多的 WEB 服務器之一,並且用來運行 ASP 頁面也是必不可少的。IIS6 自己支持 gzip 壓縮,IIS5 就比較費勁了,你能夠找一些第三方的組件來處理,不過這玩意是收費的。接下來咱們介紹如何在 IIS6 中啓用壓縮功能。 打開 Internet 信息服務(IIS)管理器,右擊」網站」->」屬性」,選擇」服務」。在 「HTTP壓縮」 框中選中 「壓縮應用程序文件」 和 「壓縮靜態文件」,按須要設置 「臨時目錄」 和 「臨時目錄的最大限制」,以下圖所示:
接下來配置 gzip 組件,在 Internet 信息服務(IIS)管理器,點擊 「Web 服務擴展」->」增長一個新的 Web 服務擴展…」,在 「新建 Web 服務擴展」 框中輸入擴展名 「HTTP Compression」,添加 「要求的文件」 爲 C:\WINDOWS\system32\inetsrv\gzip.dll,選中 「設置擴展狀態爲容許」,以下圖所示:
\"   \"  
還沒完呢,咱們還須要修改一個配置文件,修改以前請先中止 IIS 服務,打開 C:\Windows\System32\inetsrv\MetaBase.xml,這個文件很大,找到下面一段信息:
  1. <IIsCompressionScheme Location ="/LM/W3SVC/Filters/Compression/gzip" HcCompressionDll="%windir%\system32\inetsrv\gzip.dll" HcCreateFlags="1" HcDoDynamicCompression="TRUE" HcDoOnDemandCompression="TRUE" HcDoStaticCompression="TRUE" HcDynamicCompressionLevel="0" HcFileExtensions="htm html txt" HcOnDemandCompLevel="10" HcPriority="1" HcScriptFileExtensions="asp dll exe" > </IIsCompressionScheme>
    增長一些要進行壓縮的文件後綴,其中 HcFileExtensions 是靜態文件的擴展名,增長 js 和 css 等;HcScriptFileExtensions 爲動態文件的擴展名,增長 aspx,保存後啓動 IIS 便可生效。 最後咱們介紹如何來測試前面所作的工做是否起效,你可能會以爲很奇怪,配置好了,用瀏覽器打開頁面正常,查看頁面 源碼 ,內容並無變化,大小也跟原來同樣,怎麼回事呢?這是由於瀏覽器已經把內容解壓了的結果,有兩個方法來判斷壓縮是否生效:第一,查看 WEB 服務器的日誌,不論是 Apache 或者是 IIS,兩者的訪問日誌格式都差很少是下面這種格式: 127.0.0.1 - - [14/May/2006:08:44:28 +0800] "GET /manual/style/css/manual.css HTTP/1.1" 200 19351  最後兩個數字分別是 HTTP 的結果碼(200 表示 OK),19351 表示的是響應內容的大小,把這個大小跟你在瀏覽器上查看源碼的大小比較一下就能夠知道是否生效。另一種方法就是本身寫一個 HTTP 客戶端的小程序並設置 Accept-Encoding 的值爲 gzip,deflate,由這個程序去請求服務器端的某個 URL 地址,而後打印出響應的內容,若是是一堆亂碼,恭喜你,配置成功。下面是一段 Java 寫的測試客戶端代碼(須要用到 commons-httpclient 包):
HttpClient http = new HttpClient(); String url = "http://www.dlog.cn/javayou"; GetMethod get = new GetMethod(url); try{ System.out.println("fetching url : "+ url); get.addRequestHeader("accept-encoding", "gzip,deflate"); 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(); }
利用GZIP壓縮網頁(Tomcat,apache,iis)各類方法總結 參考來自http://www.huacolor.com/ http://www.2cto.com/等
相關文章
相關標籤/搜索