[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, mod_deflate, mod_gzip, ob_gzhandler, zlib. |
這兩天玩了一下 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)。接著看看效果:
壓縮比高達 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 的效果:
接著看看 zilb 的效果:
從這兩張圖會發現,其實兩個結果一模一樣。是的,我反覆測試了幾次,結果都是差不多這樣,頂多差個 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 的使用率卻有較大的不同,這個可以自行測試看看。
好了,介紹就到這邊了。(好久沒有寫有點長的文章了,好混!)





給你加加油!
寫的好棒!