Web服務器處理HTTP壓縮之gzip、deflate壓縮

1、什麼是gzip         

        gzip是一種數據格式,默認且目前僅使用deflate算法壓縮data部分;javascript

        Gzip是一種流行的文件壓縮算法,如今的應用十分普遍,尤爲是在Linux平臺。當應用Gzip壓縮到一個純文本文件時,效果是很是明顯的,大約能夠減小70%以上的文件大小。這取決於文件中的內容。php

      利用Apache中的Gzip模塊,咱們可使用Gzip壓縮算法來對Apache服務器發佈的網頁內容進行壓縮後再傳輸到客戶端瀏覽器。這樣通過壓縮後實際上下降了網絡傳輸的字節數,最明顯的好處就是能夠加快網頁加載的速度。css

      網頁加載速度加快的好處不言而喻,除了節省流量,改善用戶的瀏覽體驗外,另外一個潛在的好處是Gzip與搜索引擎的抓取工具備着更好的關係。例如 Google就能夠經過直接讀取gzip文件來比普通手工抓取更快地檢索網頁。在Google網站管理員工具(Google Webmaster Tools)中你能夠看到,sitemap.xml.gz 是直接做爲Sitemap被提交的。html

      而這些好處並不只僅限於靜態內容,PHP動態頁面和其餘動態生成的內容都可以經過使用Apache壓縮模塊壓縮,加上其餘的性能調整機制和相應的服務器端 緩存規則,這能夠大大提升網站的性能。所以,對於部署在Linux服務器上的PHP程序,在服務器支持的狀況下,咱們建議你開啓使用Gzip Web壓縮。java

PS:詳情參考:http://baike.baidu.com/item/gzip?fr=aladdinpython


2、什麼是deflate

        DEFLATE是同時使用了LZ77算法與哈夫曼編碼(Huffman Coding)的一個無損數據壓縮算法。web

        它最初是由Phil Katz爲他的PKZIP歸檔工具第二版所定義的,後來定義在RFC 1951規範中。算法

        人們廣泛認爲DEFLATE不受任何專利所制約,而且在LZW(GIF文件格式使用)相關的專利失效以前,這種格式除了在ZIP文件格式中獲得應用以外也在gzip壓縮文件以及PNG圖像文件中獲得了應用。apache

        DEFLATE壓縮與解壓的源代碼能夠在自由、通用的壓縮庫zlib上找到。瀏覽器

        更高壓縮率的DEFLATE是7-zip所實現的。AdvanceCOMP也使用這種實現,它能夠對gzip、PNG、MNG以及ZIP文件進行壓縮從而獲得比zlib更小的文件大小。在Ken Silverman的KZIP與PNGOUT中使用了一種更加高效同時要求更多用戶輸入的DEFLATE程序。

        deflate是一種壓縮算法,是huffman編碼的一種增強。

        deflate與gzip解壓的代碼幾乎相同,能夠合成一塊代碼。


3、web服務器處理http壓縮的過程

    1. Web服務器接收到瀏覽器的HTTP請求後,檢查瀏覽器是否支持HTTP壓縮(Accept-Encoding 信息);

    2. 若是瀏覽器支持HTTP壓縮,Web服務器檢查請求文件的後綴名;

    3. 若是請求文件是HTML、CSS等靜態文件,Web服務器到壓縮緩衝目錄中檢查是否已經存在請求文件的最新壓縮文件;

    4. 若是請求文件的壓縮文件不存在,Web服務器向瀏覽器返回未壓縮的請求文件,並在壓縮緩衝目錄中存放請求文件的壓縮文件;

    5. 若是請求文件的最新壓縮文件已經存在,則直接返回請求文件的壓縮文件;

    6. 若是請求文件是動態文件,Web服務器動態壓縮內容並返回瀏覽器,壓縮內容不存放到壓縮緩存目錄中。

下面是兩個演示圖:

未使用Gzip:

開啓使用Gzip後:



4、gzip與deflate區別

        deflate使用inflateInit(),而gzip使用inflateInit2()進行初始化,比 inflateInit()多一個參數: -MAX_WBITS,表示處理raw deflate數據。由於gzip數據中的zlib壓縮數據塊沒有zlib header的兩個字節。使用inflateInit2時要求zlib庫忽略zlib header。在zlib手冊中要求windowBits爲8..15,可是實際上其它範圍的數據有特殊做用,見zlib.h中的註釋,如負數表示raw deflate。        

        Apache的deflate變種可能也沒有zlib header,須要添加假頭後處理。即MS的錯誤deflate (raw deflate).zlib頭第1字節通常是0x78, 第2字節與第一字節合起來的雙字節應能被31整除,詳見rfc1950。例如Firefox的zlib假頭爲0x7801,python zlib.compress()結果頭部爲0x789c。        

        deflate 是最基礎的算法,gzip 在 deflate 的 raw data 前增長了 10 個字節的 gzheader,尾部添加了 8 個字節的校驗字節(可選 crc32 和 adler32) 和長度標識字節。

        安裝它們的Apache Web服務器版本的差別。Apache 1.x系列沒有內建網頁壓縮技術,因此纔去用額外的第三方mod_gzip 模塊來執行壓縮。而Apache 2.x官方在開發的時候,就把網頁壓縮考慮進去,內建了mod_deflate 這個模塊,用以取代mod_gzip。雖然二者都是使用的Gzip壓縮算法,它們的運做原理是相似的。     

        壓縮質量。mod_deflate 壓縮速度略快而mod_gzip 的壓縮比略高。通常默認狀況下,mod_gzip 會比mod_deflate 多出4%~6%的壓縮量。

        對服務器資源的佔用。 通常來講mod_gzip 對服務器CPU的佔用要高一些。mod_deflate 是專門爲確保服務器的性能而使用的一個壓縮模塊,mod_deflate 須要較少的資源來壓縮文件。這意味着在高流量的服務器,使用mod_deflate 可能會比mod_gzip 加載速度更快。即在服務器性能足夠的狀況下,使用mod_gzip,雖然會耗費服務器性能,可是值得(壓縮更快更好);在服務器性能不足的狀況下,使用mod_deflate 確保性能。

        從Apache 2.0.45開始,mod_deflate 可以使用DeflateCompressionLevel 指令來設置壓縮級別。該指令的值可爲1(壓縮速度最快,最低的壓縮質量)至9(最慢的壓縮速度,壓縮率最高)之間的整數,其默認值爲6(壓縮速度和壓縮質 量較爲平衡的值)。這個簡單的變化更是使得mod_deflate 能夠輕鬆媲美mod_gzip 的壓縮。


5、開啓mod_gzip、mod_deflate

        Apache上利用Gzip壓縮算法進行壓縮的模塊有兩種:mod_gzip 和mod_deflate。 要使用Gzip Web壓縮,請首先肯定你的服務器開啓了對這兩個組件之一的支持。在Linux服務器上,如今已經有愈來愈多的空間商開放了對它們的支持,有的甚至是同時 支持這兩個模塊的。例如目前Godaddy、Bluehost及DreamHosts等空間商的服務器都已同時支持mod_gzip 和mod_deflate。        

        經過查看HTTP頭,咱們能夠快速判斷使用的客戶端瀏覽器是否支持接受gzip壓縮。若發送的HTTP頭中出現如下信息,則代表你的瀏覽器支持接受相應的gzip壓縮:

    Accept-Encoding: gzip 支持mod_gzip
    Accept-Encoding: deflate 支持mod_deflate 
    Accept-Encoding: gzip,deflate 同時支持mod_gzip 和mod_deflate

        mod_deflate 是apache自帶的模塊,固然是在apache 2後支持的,之前1的時候是mod_gzip,啓用mod_deflate能夠很好的爲節省網頁大小,只不過是佔用服務器的資源和內存.用戶看到頁面的速度會大大加快。在apache2.0以上(包括apache2.0)的版中gzip壓縮使用的是mod_deflate模塊

1. 查看apache的安裝模式
apachectl -l

發現 mod_so.c,ok能夠動態加模塊,不用從新編譯。

2. 安裝mod_deflate
找到原有的apache安裝包安裝mod_deflate
cd httpd-2.0.59/modules/filters
/usr/local/apache2/bin/apxs -i -c -a mod_deflate.c

PS:apxs命令參數說明:
        -i  此選項表示須要執行安裝操做,以安裝一個或多個動態共享對象到服務器的modules目錄中。
        -a  此選項自動增長一個LoadModule行到httpd.conf文件中,以激活此模塊,或者,若是此行已經存在,則啓用之。
        -A  與 -a 選項相似,可是它增長的LoadModule命令有一個井號前綴(#),即此模塊已經準備就緒但還沒有啓用。
        -c  此選項表示須要執行編譯操做。它首先會編譯C源程序(.c)files爲對應的目標代碼文件(.o),而後鏈接這些目標代碼和files中其他的目標代碼文件(.o和.a),以生成動態共享對象dsofile 。若是沒有指定 -o 選項,則此輸出文件名由files中的第一個文件名推測獲得,也就是默認爲mod_name.so 。

三、修改Apache的http.conf文件,去除mod_deflate.so前面的註釋

LoadModule deflate_module modules/mod_deflate.so

四、在根目錄中新建.htaccess文件,定製壓縮規則

#GZIP壓縮模塊配置<ifmodule mod_deflate.c>
#啓用對特定MIME類型內容的壓縮
SetOutputFilter DEFLATESetEnvIfNoCase Request_URI .(?:gif|jpe?g|png|exe|t?gz|zip|bz2|sit|rar|pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary #設置不對壓縮的文件AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-httpd-php application/x-javascript #設置對壓縮的文件</ifmodule>

五、對指定的文件配置緩存的生存時間,去除mod_headers.so模塊前面的註釋

LoadModule headers_module modules/mod_headers.so

六、在根目錄中新建.htaccess文件,定製壓縮規則

#文件緩存時間配置
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>

裏面的文件MIME類型能夠根據本身狀況添加,至於PDF 、圖片、音樂文檔之類的這些自己都已經高度壓縮格式,重複壓縮的做用不大,反而可能會由於增長CPU的處理時間及瀏覽器的渲染問題而下降性能。因此就不必再經過Gzip壓縮。經過以上設置後再查看返回的HTTP頭,出現如下信息則代表返回的數據已通過壓縮。即網站程序所配置的Gzip壓縮已生效。

Content-Encoding: gzip

注:無論使用mod_gzip 仍是mod_deflate,此處返回的信息都同樣。由於它們都是實現的gzip壓縮方式。


遇到的問題以及解決:

1:

apach2 安裝mod_deflate後restart,直接

load /opt/apache/modules/mod_deflate.so into server: /opt/apache/modules/mod_deflate.so: undefined symbol: deflate 異常的痛苦

什麼ldd mod_deflate.so後再export LIB_LIBRARY_PATH呀,都試了N次,google也go了N天

終於在google上go出來一篇文章,終於解決,方法以下: vi /usr/local/apache2/bin/apr-config 修改LDFLAGS=" " 爲 LDFLAGS="-lz" 而後再apxs -ica mod_deflate.c 就OK了.

2:
apach2 安裝mod_deflate後restart,直接

module deflate_module is built-in and can't be loaded ...

這說明該模塊已經安裝,沒必要再LoadModule deflate_module啓用它。

只需作<ifmodule mod_deflate.c>配置


參考:

http://qbaok.blog.163.com/blog/static/101292652008101431233385/

http://blog.sina.com.cn/s/blog_a34721f00101f658.html

http://blog.csdn.net/zhangxinrun/article/details/5711307

http://baike.baidu.com/view/4795073.htm?fr=aladdin

http://baike.baidu.com/item/gzip?fr=aladdin

http://www.cnblogs.com/linzhenjie/archive/2013/03/05/2943635.html

http://www.cnblogs.com/zhangziqiu/archive/2009/05/17/gzip.html

相關文章
相關標籤/搜索