歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> gzip的工作原理和在Nginx和Apache中應用

gzip的工作原理和在Nginx和Apache中應用

日期:2017/2/27 16:06:20   编辑:Linux教程

Gzip Web壓縮工作原理

Web服務器處理HTTP壓縮的過程如下:

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

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

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

4. 如果請求文件的壓縮文件不存在,Web服務器向浏覽器返回未壓縮的請求文件,並在壓縮緩沖目錄中存放請求文件的壓縮文件;

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

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

下面是兩個演示圖:

未使用Gzip:

開啟使用Gzip後:

Gzip是一種流行的文件壓縮算法,現在的應用十分廣泛,尤其是在Linux平台。當應用Gzip壓縮到一個純文本文件時,效果是非常明顯的,大約可以減少70%以上的文件大小。這取決於文件中的內容。

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

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

而這些好處並不僅僅限於靜態內容,PHP動態頁面和其他動態生成的內容均可以通過使用Apache壓縮模塊壓縮,加上其他的性能調整機制和相應的服務器端緩存規則,這可以大大提高網站的性能。

因此,對於部署在Linux服務器上的PHP程序,在服務器支持的情況下,我們建議你開啟使用Gzip Web壓縮。

Nginx環境實現gzip優化web:
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;

Apache環境實現gzip優化web:
如果要開啟gzip的話,一定要打開下面二個模塊.
LoadModule headers_module modules/mod_headers.so
LoadModule deflate_module modules/mod_deflate.so

設置壓縮比率,取值范圍在 1(最低) 到 9(最高)之間,不建議設置太高,雖然有很高的壓縮率,但是占用更多的CPU資源.
DeflateCompressionLevel 3
AddOutputFilter DEFLATE html xml php js css
<Location />
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \\.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary

Header append Vary User-Agent env=!dont-vary #對代理的設置
</Location>

注意點:

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

雖然使用Gzip同時也需要客戶端浏覽器的支持,不過不用擔心,目前大部分浏覽器都已經支持Gzip了,如IE、Mozilla Firefox、Opera、Chrome等。

通過查看HTTP頭,我們可以快速判斷使用的客戶端浏覽器是否支持接受gzip壓縮。若發送的HTTP頭中出現以下信息,則表明你的浏覽器支持接受相應的gzip壓縮:

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

如果服務器開啟了對Gzip組件的支持,那麼我們就可以在http.conf或.htaccess裡面進行定制,下面是一個.htaccess配置的簡單實例:

# mod_gzip:
<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

# mod_deflate:
<ifmodule mod_deflate.c>
DeflateCompressionLevel 6 #壓縮率, 6是建議值.
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE image/svg+xml
</ifmodule>

裡面的文件MIME類型可以根據自己情況添加,至於PDF 、圖片、音樂文檔之類的這些本身都已經高度壓縮格式,重復壓縮的作用不大,反而可能會因為增加CPU的處理時間及浏覽器的渲染問題而降低性能。所以就沒必要再通過Gzip壓縮。

通過以上設置後再查看返回的HTTP頭,出現以下信息則表明返回的數據已經過壓縮。即網站程序所配置的Gzip壓縮已生效。

Content-Encoding: gzip

注:不管使用mod_gzip 還是mod_deflate,此處返回的信息都一樣。因為它們都是實現的gzip壓縮方式。

檢測是否支持gzip壓縮:http://tool.chinaz.com/Gzips/

mod_gzip 和mod_deflate的主要區別是什麼?使用哪個更好呢?

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

2. 第二個區別是壓縮質量。mod_deflate 壓縮速度略快而mod_gzip 的壓縮比略高。一般默認情況下,mod_gzip 會比mod_deflate 多出4%~6%的壓縮量。

3. 對服務器資源的占用。一般來說mod_gzip 對服務器CPU的占用要高一些。mod_deflate 是專門為確保服務器的性能而使用的一個壓縮模塊,mod_deflate 需要較少的資源來壓縮文件。這意味著在高流量的服務器,使用mod_deflate 可能會比mod_gzip 加載速度更快。

不太明白?簡而言之,如果你的網站,每天不到1000獨立訪客,想要加快網頁的加載速度,就使用mod_gzip。雖然會額外耗費一些服務器資源, 但也是值得的。如果你的網站每天超過1000獨立訪客,並且使用的是共享的虛擬主機,所分配系統資源有限的話,使用mod_deflate 將會是更好的選擇。

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

P.S. 對於沒有啟用以上兩種Gzip模塊的虛擬空間,還可以退而求其次使用php的zlib函數庫(同樣需要查看服務器是否支持)來壓縮文件,只是這種方法使用起來比較麻煩,而且一般會比較耗費服務器資源,請根據情況慎重使用。

Copyright © Linux教程網 All Rights Reserved