1. 如何利用gzip壓縮網頁來提升網站瀏覽速度
純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 文件也算在壓縮的文件類型中,因為這兩者的壓縮效果也十分的明顯。
Apache 伺服器
在
apache 1.3 版本,大家常用 mod_gzip 對輸出內容進行壓縮,現在主流的瀏覽器都支持 gzip 解壓縮。在 apache2
下,這個模塊換名為 mod_deflate,對應的模塊文件名是 mod_deflate.so。mod_gzip 本文不做介紹,下面描述一下在
Apache 2 下如何啟用並配置 mod_deflate 模塊。默認安裝的 Apache 不管是 Windows 還是
Linux/Unix,都是不啟用該模塊的, Linux/Unix 下甚至不帶該模塊,你需要手工編譯這個模塊。
下面我們分別介紹在 Windows 和 Linux 操作系統下如何啟用並配置 mod_deflate 模塊。
在 Windows 下採用安裝程序安裝的 Apache 伺服器已經帶有 deflate 所需要的模塊 mod_deflate.so 和 mod_headers.so,我們只需要在 httpd.conf 配置文件中啟用並進行相關的配置即可,配置如下:
LoadMole deflate_mole moles/mod_deflate.so
LoadMole headers_mole moles/mod_headers.so
<Location />
# Insert filter
SetOutputFilter DEFLATE
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# Don't compress images
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</Location>
而
如果是 Linux/Unix 操作系統,如果你沒有在編譯安裝的過程中將所需要的兩個模塊 mod_deflate 和 mod_headers
編譯進去的話,那就稍微有點麻煩,首先我們先看如何在編譯安裝 Apache 過程中也同時編譯這兩個模塊,請在執行 configure
程序時增加兩個參數分別是:
# ./configure --enable-deflate --enable-headers
這樣在編譯完 Apache 後就可以直接在 httpd.conf 中啟用並配置 deflate 模塊了,配置的方法跟 Windows 平台下是相同的。
如
果說您的 Apache 已經在運行了,不想再重新編譯一次,那也可以選擇只編譯 deflate 模塊所需的文件 mod_deflate.c
和mod_headers.c。這兩個文件位於 {apache-src}/moles/filters/ 目錄下(其中 {apache-src}
為 apache 源文件所在的目錄)。使用如下命令來單獨編譯這兩個源文件。
# {apache-bin}/apxs -i -a -c {apache-src}/moles/filters/mod_deflate.c
# {apache-bin}/apxs –i –a –c {apache-src}/moles/filters/mod_headers.c
其中 {apache-bin} 為 Apache 安裝目錄下的 bin 目錄,接下來在 httpd.conf 直接配置該模塊即可。
很多時候你在單獨編譯 deflate 模塊的時候可能會碰到編譯錯誤,提示是:
Cannot load /opt/apache/moles/mod_deflate.so into server: /opt/apache/moles/mod_deflate.so: undefined symbol: deflate
解決的方法如下:
編輯 /usr/local/apache2/bin/apr-config 文件修改其中的 LDFLAGS 值為 "-lz",然後再重新編譯 mod_deflate 模塊,apxs -ica mod_deflate.c 即可。
為了省卻不必要的麻煩,請盡量在編譯安裝時直接加上 --enable-deflate --enable-headers 參數。
IIS 伺服器
微
軟的 IIS 伺服器同樣也是目前用得最多的 WEB 伺服器之一,而且用來運行 ASP 頁面也是必不可少的。IIS6,iis本身支持 gzip
壓縮,IIS5就比較費勁了,你可以找一些第三方的組件來處理,例如 httpzip,接下來我們介紹如何在 IIS6 中啟用壓縮功能。
打開 Internet 信息服務(IIS)管理器,右擊"網站"->"屬性",選擇"服務"。在 "HTTP壓縮" 框中選中 "壓縮應用程序文件" 和 "壓縮靜態文件",按需要設置 "臨時目錄" 和 "臨時目錄的最大限制",
設置網站屬性
接
下來配置 gzip 組件,在 Internet 信息服務(IIS)管理器,點擊 "Web 服務擴展"->"增加一個新的 Web
服務擴展...",在 "新建 Web 服務擴展" 框中輸入擴展名 "HTTP Compression",添加 "要求的文件" 為
C:\WINDOWS\system32\inetsrv\gzip.dll,選中 "設置擴展狀態為允許",如下圖所示:
設置 Web 服務擴展,新建 Web 服務擴展
還沒完呢,我們還需要修改一個配置文件,修改之前請先停止 IIS 服務,打開 C:\Windows\System32\inetsrv\MetaBase.xml,這個文件很大,找到下面一段信息:
<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.softbar.com;
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();
}
結論
以
上是目前比較流行的兩個 WEB 伺服器軟體以及 Tomcat 伺服器對於頁面壓縮的配置方法;其他的一些 J2EE
應用伺服器如果不支持這個功能的話可以考慮利用過濾器(Servlet Filter)來進行處理,具體的代碼以及配置方法可以參考 Resin
伺服器所提供的文檔。但是有一點需要提醒各位讀者的是,本文介紹的訪問只是在伺服器本身的響應速度已經足夠優化的情況下進行,也就是說在帶寬成為系統瓶頸
的時候才來考慮該方案。