站長(cháng)交易(http://jy.chinaz.com)幫站長(cháng)賺錢(qián) 虛擬主機評測+IDC導航=IDC123.COM
使用mod_gzip 和 mod_deflate對網(wǎng)頁(yè)內容進(jìn)行壓縮
Gzip是一種流行的文件壓縮算法,現在的應用十分廣泛,尤其是在Linux平臺。當應用Gzip壓縮到一個(gè)純文本文件時(shí),效果是非常明顯的,大約可以減少70%以上的文件大小。這取決于文件中的內容。
利用Apache中的Gzip模塊,我們可以使用Gzip壓縮算法來(lái)對Apache服務(wù)器發(fā)布的網(wǎng)頁(yè)內容進(jìn)行壓縮后再傳輸到客戶(hù)端瀏覽器。這樣經(jīng)過(guò)壓縮后實(shí)際上降低了網(wǎng)絡(luò )傳輸的字節數,最明顯的好處就是可以加快網(wǎng)頁(yè)加載的速度。
網(wǎng)頁(yè)加載速度加快的好處不言而喻,除了節省流量,改善用戶(hù)的瀏覽體驗外,另一個(gè)潛在的好處是Gzip與搜索引擎的抓取工具有著(zhù)更好的關(guān)系。例如Google就可以通過(guò)直接讀取gzip文件來(lái)比普通手工抓取更快地檢索網(wǎng)頁(yè)。在Google網(wǎng)站管理員工具(Google Webmaster Tools)中你可以看到,sitemap.xml.gz 是直接作為Sitemap被提交的。
而這些好處并不僅僅限于靜態(tài)內容,PHP動(dòng)態(tài)頁(yè)面和其他動(dòng)態(tài)生成的內容均可以通過(guò)使用Apache壓縮模塊壓縮,加上其他的性能調整機制和相應的服務(wù)器端緩存規則,這可以大大提高網(wǎng)站的性能。
因此,對于部署在Linux服務(wù)器上的PHP程序,在服務(wù)器支持的情況下,我們建議你開(kāi)啟使用Gzip Web壓縮。
二、 Gzip Web壓縮工作原理
Web服務(wù)器處理HTTP壓縮的過(guò)程如下:
1. Web服務(wù)器接收到瀏覽器的HTTP請求后,檢查瀏覽器是否支持HTTP壓縮(Accept-Encoding 信息);
2. 如果瀏覽器支持HTTP壓縮,Web服務(wù)器檢查請求文件的后綴名;
3. 如果請求文件是HTML、CSS等靜態(tài)文件,Web服務(wù)器到壓縮緩沖目錄中檢查是否已經(jīng)存在請求文件的最新壓縮文件;
4. 如果請求文件的壓縮文件不存在,Web服務(wù)器向瀏覽器返回未壓縮的請求文件,并在壓縮緩沖目錄中存放請求文件的壓縮文件;
5. 如果請求文件的最新壓縮文件已經(jīng)存在,則直接返回請求文件的壓縮文件;
6. 如果請求文件是動(dòng)態(tài)文件,Web服務(wù)器動(dòng)態(tài)壓縮內容并返回瀏覽器,壓縮內容不存放到壓縮緩存目錄中。
下面是兩個(gè)演示圖:
未使用Gzip:

開(kāi)啟使用Gzip后:

三、讓我們開(kāi)始吧!
Apache上利用Gzip壓縮算法進(jìn)行壓縮的模塊有兩種:mod_gzip 和mod_deflate。要使用Gzip Web壓縮,請首先確定你的服務(wù)器開(kāi)啟了對這兩個(gè)組件之一的支持。在Linux服務(wù)器上,現在已經(jīng)有越來(lái)越多的空間商開(kāi)放了對它們的支持,有的甚至是同時(shí)支持這兩個(gè)模塊的。例如目前Godaddy、Bluehost及DreamHosts等空間商的服務(wù)器都已同時(shí)支持mod_gzip 和mod_deflate。
雖然使用Gzip同時(shí)也需要客戶(hù)端瀏覽器的支持,不過(guò)不用擔心,目前大部分瀏覽器都已經(jīng)支持Gzip了,如IE、Mozilla Firefox、Opera、Chrome等。
通過(guò)查看HTTP頭,我們可以快速判斷使用的客戶(hù)端瀏覽器是否支持接受gzip壓縮。
若發(fā)送的HTTP頭中出現以下信息,則表明你的瀏覽器支持接受相應的gzip壓縮:
Accept-Encoding: gzip 支持mod_gzip
Accept-Encoding: deflate 支持mod_deflate
Accept-Encoding: gzip,deflate 同時(shí)支持mod_gzip 和mod_deflate
如果服務(wù)器開(kāi)啟了對Gzip組件的支持,那么我們就可以在http.conf或.htaccess里面進(jìn)行定制,下面是一個(gè).htaccess配置的簡(jiǎn)單實(shí)例:
| 以下為引用的內容: # mod_gzip: |
| 以下為引用的內容: # mod_deflate: |
里面的文件MIME類(lèi)型可以根據自己情況添加,至于PDF 、圖片、音樂(lè )文檔之類(lèi)的這些本身都已經(jīng)高度壓縮格式,重復壓縮的作用不大,反而可能會(huì )因為增加CPU的處理時(shí)間及瀏覽器的渲染問(wèn)題而降低性能。所以就沒(méi)必要再通過(guò)Gzip壓縮。
通過(guò)以上設置后再查看返回的HTTP頭,出現以下信息則表明返回的數據已經(jīng)過(guò)壓縮。即網(wǎng)站程序所配置的Gzip壓縮已生效。
Content-Encoding: gzip
注:不管使用mod_gzip 還是mod_deflate,此處返回的信息都一樣。因為它們都是實(shí)現的gzip壓縮方式。
除此之外,還可以通過(guò)一些在線(xiàn)檢測工具(如:http://www.whatsmyip.org/http_compression/)來(lái)檢測你的網(wǎng)站內容是否已經(jīng)過(guò)Gzip壓縮。
四、mod_gzip 和mod_deflate的主要區別是什么?使用哪個(gè)更好呢?
首先一個(gè)區別是安裝它們的Apache Web服務(wù)器版本的差異。Apache 1.x系列沒(méi)有內建網(wǎng)頁(yè)壓縮技術(shù),所以才去用額外的第三方mod_gzip 模塊來(lái)執行壓縮。而Apache 2.x官方在開(kāi)發(fā)的時(shí)候,就把網(wǎng)頁(yè)壓縮考慮進(jìn)去,內建了mod_deflate 這個(gè)模塊,用以取代mod_gzip。雖然兩者都是使用的Gzip壓縮算法,它們的運作原理是類(lèi)似的。
第二個(gè)區別是壓縮質(zhì)量。mod_deflate 壓縮速度略快而mod_gzip 的壓縮比略高。一般默認情況下,mod_gzip 會(huì )比mod_deflate 多出4%~6%的壓縮量。
那么,為什么使用mod_deflate?第三個(gè)區別是對服務(wù)器資源的占用。一般來(lái)說(shuō)mod_gzip 對服務(wù)器CPU的占用要高一些。mod_deflate 是專(zhuān)門(mén)為確保服務(wù)器的性能而使用的一個(gè)壓縮模塊,mod_deflate 需要較少的資源來(lái)壓縮文件。這意味著(zhù)在高流量的服務(wù)器,使用mod_deflate 可能會(huì )比mod_gzip 加載速度更快。
不太明白?簡(jiǎn)而言之,如果你的網(wǎng)站,每天不到1000獨立訪(fǎng)客,想要加快網(wǎng)頁(yè)的加載速度,就使用mod_gzip。雖然會(huì )額外耗費一些服務(wù)器資源,但也是值得的。如果你的網(wǎng)站每天超過(guò)1000獨立訪(fǎng)客,并且使用的是共享的虛擬主機,所分配系統資源有限的話(huà),使用mod_deflate 將會(huì )是更好的選擇。
另外,從Apache 2.0.45開(kāi)始,mod_deflate 可使用DeflateCompressionLevel 指令來(lái)設置壓縮級別。該指令的值可為1至(壓縮速度最快,最低的壓縮質(zhì)量)9(最慢的壓縮速度,壓縮率最高)之間的整數,其默認值為6(壓縮速度和壓縮質(zhì)量較為平衡的值)。這個(gè)簡(jiǎn)單的變化更是使得mod_deflate 可以輕松媲美mod_gzip 的壓縮。
Linux 空間不支持mod_gzip、mod_deflate模塊
Linux 空間不支持mod_gzip、mod_deflate模塊,若想通過(guò)GZIP壓縮網(wǎng)頁(yè)內容,可以考慮兩種方式,開(kāi)啟zlib.output_compression或者通過(guò)ob_gzhandler編碼的方式。
zlib.output_compression是在對網(wǎng)頁(yè)內容壓縮的同時(shí)發(fā)送數據至客戶(hù)端,ob_gzhandler是等待網(wǎng)頁(yè)內容壓縮完畢后才進(jìn)行發(fā)送,相比之下前者效率更高,但需要注意的是,兩者不能同時(shí)使用,只能選其一,否則將出現錯誤。
下文僅針對GoDaddy Deluxe Hosting – Linux 空間,對兩者的實(shí)現方式做簡(jiǎn)單描述。
在默認情況下,zlib.output_compression是關(guān)閉的,如需開(kāi)啟需編輯php5.ini文件,加入以下內容:
| 以下為引用的內容: zlib.output_compression = On zlib.output_compression_level = 6 |
然后將php5.ini上傳到FTP根目錄下,剩下的事請就是等待它生效,這可能需要一段時(shí)間,可以通過(guò)phpinfo()函數檢測結果:
| 以下為引用的內容: Directive Local Value Master Value zlib.output_compression On On zlib.output_compression_level 6 6 |
當zlib.output_compression的Local Value和MasterValue的值同為On時(shí),表示已經(jīng)生效,這時(shí)候訪(fǎng)問(wèn)的PHP頁(yè)面(包括偽靜態(tài)頁(yè)面)已經(jīng)GZIP壓縮了,通過(guò)Firebug或者在線(xiàn)網(wǎng)頁(yè)GZIP壓縮檢測工具可檢測到壓縮的效果。
如果需要使用ob_gzhandler,則需關(guān)閉zlib.output_compression,把php5.ini文件內容更改為:
| 以下為引用的內容: zlib.output_compression = Off zlib.output_compression_level = -1 |
ob_gzhandler是GoDaddy官網(wǎng)推薦的用法,通過(guò)在PHP文件中插入相關(guān)代碼實(shí)現GZIP壓縮,以下是GoDaddy幫助中心所提到的:
GZIP Compression
|
《Compressing Web Pages for Faster Load Times》文中提到,將以下PHP代碼加入到PHP文件頂部,即可實(shí)現GZIP壓縮。
| 以下為引用的內容: <?php if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start(); ?> |
不管是zlib.output_compression還是ob_gzhandler,都僅能對PHP文件進(jìn)行GZIP壓縮,對于HTML、CSS、JS等靜態(tài)文件只能通過(guò)調用PHP的方式實(shí)現。
最后想說(shuō)的是,現在主流的瀏覽器默認使用的是HTTP1.1協(xié)議,基本都支持GZIP壓縮,對于IE而言,假如你沒(méi)有選中其菜單欄工具-》Internet 選項-》高級-》HTTP 1.1 設置-》使用 HTTP 1.1,那么,你將感受不到網(wǎng)頁(yè)壓縮后的速度提升所帶來(lái)的快感!
注明:文章mod_gzip 和mod_deflate壓縮方法的內容來(lái)自風(fēng)的翅膀;zlib.output_compression與ob_gzhandler壓縮方法來(lái)自chibl.com
聯(lián)系客服