[Apache] 壓縮你的網頁 - mod_deflate/mod_gzip、ob_gzhandler、zlib

| 五月 28, 2007 | 2個迴響| 沒有引用| 3323 reads | Size: L, M, S | Edit: P, C, R |
| Category: Server. and Tags: , , , , . |

    這兩天玩了一下 Apache 和 PHP 的壓縮模組,順便找了點資料。

    簡單說,就是在網頁要送出來前,經過 gzip 的壓縮,然後才送出來,因為經過壓縮,同一個網頁就小了不少,因此也可以較快的看到網頁,也可以有較好的傳輸效率。不過要注意的,因為每送出一次網頁,就需要壓縮一次,因此對主機的負擔也會比較大一點,所以在設定壓縮等級時,有必要試主機的等級來調整。好了,進入主題吧。

    UPDATE 2007-05-29: 補上了 mod_gzip 的設定方法。

    UPDATE 2007-05-29: 自己測試後,修正了 mod_gzip 的設定方法。

    在Un*x 下,主要有三種壓縮方式,分別是:Apache 的 mod_deflate/mod_gzip 模組、以及 PHP 內部的 ob_gzhandler、和 zlib。首先,來介紹一下簡易的測試工具:Port80 Software 提供的 Real-Time Compression Check。這個工具可以幫你測試某位置是否有啟用網頁壓縮的功能,並且可以得知壓縮前後的檔案大小、壓縮比、以及各個頻寬下所需要的讀取時間 等等。

    mod_deflate/mod_gzip

    其實,在 Apache 1.x 的時候,大多數是使用 mod_gzip,但是到了 Apache 2.x 之後,因為預設就會有 mod_deflate 模組,所以通常也就直接拿來用了。從這篇「Compressing Web Content with mod_gzip and mod_deflate」的內容,可以發現,兩者的效果差不多(如果沒看錯的話,XD)。接著看看效果:

    mod_deflate

    壓縮比高達 71%,節省了一半以上的體積。接著看看怎麼開啟:

    如果是 FreeBSD,在 httpd.conf 中,加上

    <IfModule mod_deflate.c>
           DeflateCompressionLevel 6
           AddOutputFilterByType   DEFLATE text/html text/plain text/xml application/x-httpd-php
           AddOutputFilter         DEFLATE  html  htm  xml  php  css  js
    </IfModule>

    這樣就可以了,如果不行,可能就還要加上例如:

    LoadModule      deflate_module    libexec/apache22/mod_deflate.so 

    之類的設定(要記得修改 .so 的路徑),來讓 Apache 載入該模組。完成後,重開 apache,就可以用「Real-Time Compression Check」來測試看看效果了。

    UPDATE 2007-05-29:

    由於 1.x 沒有 mode_deflate,所以必須要搭配 mod_gzip,在 FreeBSD 的安裝方法是:

    # cd /usr/ports/www/mod_gzip 
    # make install clean

    接著編輯 httpd.conf,加上:

    LoadModule      gzip_module    libexec/apache/mod_gzip.so

    # AddModule      mod_gzip.c  #有上面那行就不需要這個了。

    <IfModule mod_gzip.c>
    mod_gzip_on   Yes
    # mod_gzip_compression_level   6  # 現在好像根本沒這個參數,加上去會有錯。參考 這邊
    mod_gzip_item_include file \.html$
    mod_gzip_item_include file \.htm$
    mod_gzip_item_include file \.xml$
    mod_gzip_item_include file \.php$
    mod_gzip_item_include file \.css$
    mod_gzip_item_include file \.js$
    </IfModule>

    記得把「\」改成半形。接著一樣,儲存後重開,然後就可以去測試看看了。

     

    ob_gzhandler 與 zlib

    這兩個,都是 php 提供的功能。主要的差別在於,zlib 會等所有的 php 執行完畢後,才把結果壓縮起來傳送;而 ob_gzhandler 則是一段段一邊執行一邊壓縮,達到預設的大小(預設是 4KB)後就送出。也因此,zlib 在顯示上會比較慢,但是它的好處是可以設定壓縮等級等等參數。

    首先來看看 ob_gzhandler 的效果:

    gzhandler

    接著看看 zilb 的效果:

    zlib

    從這兩張圖會發現,其實兩個結果一模一樣。是的,我反覆測試了幾次,結果都是差不多這樣,頂多差個 1 byte 吧。好吧,接著來看看怎麼啟用: 

    ob_gzhandler 方面,首先編輯 php.ini 檔案,找到「output_buffering =」和「output_handler =」,將他們改為:

    output_buffering = On
    output_handler = ob_gzhandler

    接著重開 apache 即可。一樣可以到那個網站去測試看看。

    zlib 部分,一樣編輯 php.ini 檔案,找到「zlib.output_compression =」和「zlib.output_compression_level =」,改為:

    zlib.output_compression = On
    zlib.output_compression_level = 6

    這樣就可以了,不過要注意的是,要記得開啟 zlib 的 php extensio。接著重開 apache 即可。

    還有一點要注意的是,這三者不能夠共存!所以當你開啟一項的時候,記得把另外兩個的設定關閉。

     

    如果你是無法更動 php.ini 或是 httpd.conf 的虛擬主機一族,不打緊,還有別的辦法。或是,你只希望加速部分資料夾,可以在 .htaccess 設定:

    php_value   output_handler ob_gzhandler

    來開啟 ob_gzhandler 功能。或是用:

    php_flag   zlib.output_compression   on
    php_value   zlib.output_compression_level   2

    這樣一樣可以啟用 zlib。然後就可以用「Real-Time Compression Check」來試試看是否成功了。

     

    回到前面,雖說兩者的結果相近,但是再往上看,還會發現其實跟 mod_deflate的效果也是差不了多少。我想,也許跟他們都是用 gzip 有關係吧?從「mod_deflate/ob_gzhandler/zlib 橫向測試」這篇的測試結果來看,也是如此,大小都差不多。

    但是 mod_deflate/mod_gzip 的好處是支援的格式更多,不限定於 php、而且它的結果是直接儲存在記憶體中,而不像另外兩者先儲存到硬碟快取中,因此效率、速度都比較好。目前我就是用這個!

    還有,就是 mod_deflate/mod_gzip 和 zlib 的設定裡面,都可以看到 Compression Level 的設定,這邊要注意!當你把壓縮等級調大,雖然說檔案會變小,不過相對的,對主機也是一個負擔,所以最好調整一個合用的等級。預設通常為 6,可以接受的範圍是 1~9,不過根據我測試,6 以上其實大小就差不了多少了,但是 cpu 的使用率卻有較大的不同,這個可以自行測試看看。

    好了,介紹就到這邊了。(好久沒有寫有點長的文章了,好混!)




Leave A Comment:













   


2 迴響 of "[Apache] 壓縮你的網頁 - mod_deflate/mod_gzip、ob_gzhandler、zlib"

jeromeRe: [Apache] 壓縮你的網頁 - mod_deflate、ob_gzhandler、zlib By jerome @ 2007 五月 29, 12:22 :

給你加加油!
寫的好棒!

笨蛋Re: [Apache] 壓縮你的網頁 - mod_deflate/mod_gzip、ob_gzhandler、zlib By 笨蛋 @ 2007 七月 30, 17:13 :

怎麼開啟 zlib 的 php extensio?