GZIP概念
GZIP最早由Jean-loup Gailly和Mark Adler創建,用於UNⅨ系統的檔案壓縮。我們在Linux中經常會用到後綴為.gz的檔案,它們就是GZIP格式的。現今已經成為Internet 上使用非常普遍的一種數據壓縮格式,或者說一種檔案格式。
HTTP協定上的GZIP編碼是一種用來改進WEB應用程式性能的技術。大流量的WEB站點常常使用GZIP壓縮技術來讓用戶感受更快的速度。這一般是指WWW伺服器中安裝的一個功能,當有人來訪問這個伺服器中的網站時,伺服器中的這個功能就將網頁內容壓縮後傳輸到來訪的電腦瀏覽器中顯示出來.一般對純文本內容可壓縮到原大小的40%.這樣傳輸就快了,效果就是你點擊網址後會很快的顯示出來.當然這也會增加伺服器的負載. 一般伺服器中都安裝有這個功能模組的。
gzip 命令
減少檔案大小有兩個明顯的好處,一是可以減少存儲空間,二是通過網路傳輸檔案時,可以減少傳輸的時間。gzip 是在 Linux 系統中經常使用的一個對檔案進行壓縮和解壓縮的命令,既方便又好用。
語法:gzip [選項] 壓縮(解壓縮)的檔案名稱
該命令的各選項含義如下:
-c 將輸出寫到標準輸出上,並保留原有檔案。
-d 將壓縮檔案解壓。
-l 對每個壓縮檔案,顯示下列欄位:
壓縮檔案的大小;未壓縮檔案的大小;壓縮比;未壓縮檔案的名字
-r 遞歸式地查找指定目錄並壓縮其中的所有檔案或者是解壓縮。
-t 測試,檢查壓縮檔案是否完整。
-v 對每一個壓縮和解壓的檔案,顯示檔案名稱和壓縮比。
-num 用指定的數字 num 調整壓縮的速度,-1 或 --fast 表示最快壓縮方法(低壓縮比),
-9 或--best表示最慢壓縮方法(高壓縮比)。系統預設值為 6。
指令實例:
gzip *
% 把當前目錄下的每個檔案壓縮成 .gz 檔案。
gzip -dv *
% 把當前目錄下每個壓縮的檔案解壓,並列出詳細的信息。
gzip -l *
% 詳細顯示例1中每個壓縮的檔案的信息,並不解壓。
gzip usr.tar
% 壓縮 tar備份檔案usr.tar,此時壓縮檔案的擴展名為.tar.gz。
快速啟動
在WordPress中雖然有外掛程式可以啟動Gzip網頁壓縮,不過能通過幾句語法來達到網頁壓縮,這樣不是更好嗎?其實在PHP中,有一句語法是可以開啟Gzip的,只要加在網頁輸出的前端即可。在WordPress中,其實大部分的快取外掛程式都有內建啟動Gzip壓縮功能,不論是老牌的快取外掛程式WP Super Cache、輕巧的1 Blog Cacher或是hyper Cache都可以啟動Gzip網頁壓縮功能。如果你沒有裝這些外掛程式,或是這些外掛程式雖然啟動了Gzip功能但是檢測出來卻沒有壓縮,那你可能需要通過外掛程式GZippy來啟動,不過通過這個外掛程式來啟動時,記得快取外掛程式本身的Gzip要關掉,否則可能造成衝突。
第一步:打開IIS,啟用HTTP壓縮服務
右擊“網站”->“屬性”,選擇“服務”。在“HTTP壓縮”框中選中“壓縮應用程式檔案”和“ 壓縮靜態檔案”,按需要設定“臨時目錄”和“臨時目錄的最大限制”;
第二步:啟用web服務
第三步:修改MetaBase.xml
開始 > 運行中輸入 c:\windows\system32\inetsrv,找到 MeteBase.xml,先備份,再修改。(有的伺服器不需要修改此檔案便可以使用)
ⅡS或Apache啟用GZIP壓縮最佳化網站
先來了解一下GZIP,gzip是GNU zip的縮寫,它是一個GNU自由軟體的檔案壓縮程式,也經常用來表示gzip這種檔案格式。軟體的作者是Jean-loupGailly和Mark Adler。1992年10月31日第一次公開發布,版本號是0.1,目前的穩定版本是1.2.4。
gzip可以極大的加速網站.有時壓縮比率高達80%,近來測試了一下,最少都有40%以上,還是相當不錯的.在Apache2之後的版本,模組名不叫gzip,而叫mod_deflate
1、Apache啟用gzip
如果要開啟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>
下面二個測試網站
測試數據對css
Original Size: 44 KB
Gzipped Size: 10 KB
Data Savings: 77.27%
測試數據js
Original Size: 6 KB
Gzipped Size: 2 KB
Data Savings: 66.67%
測試數據php
Original Size: 62 KB
Gzipped Size: 15 KB
Data Savings: 75.81%
上面只是隨機拿的幾個數據,看的出來,使用了gzip壓縮後檔案小多了.
另外講一下,有關squid對gzip的處理
在squid中,對同一個URL只保留一份快取。對於如果不同browser(是否支持壓縮)如果頻繁交替訪問,例如:對某個cache住的目標,一個http/1.0請求可能會導致squid強制更新其快取。但接下來的另一個http/1.1請求又會導致squid再次更新快取。這樣那squid快取數據就要頻繁更新,這就極大的降低了cache命中率。
不過還好,現實環境中不支持壓縮的browser畢竟是很少的情況,所以對於快取命中率的降低很有限.
這個神通廣大的模組就是mod_gzip.它通過用和gzip一樣的壓縮算法對apache發出的頁面進行壓縮,可能的話可以把頁面壓縮成為原來大小的十份之一。哪,如果10K的頁面只要傳1K這不就是提速10倍嘛。當然一般網頁只可以達到3-6倍。那也很不錯。對吧。連google這樣一個大的網站都採用這個技術。你還不快跟上?
這樣一個好東東,來來來,我告訴你如何安裝:分3步,1、下載,2、修改配置,3、測試。
安裝,配置
把mod_gzip放到你的apache的原始碼目錄下,新建一個mod_gzip目錄如果需要補丁(針對1.3.17. la版) 還需運行:
patch mod_gizp.c
按你需要,在配置中選擇動態DSO或靜態編譯進apache系統。如何處理在README中講得很清楚,如-add-module=mod_gzip.c,make,make install等等。這裡不多講。
把下列配置加入httpd.conf尾部。
# MOD_GZIP configuration
mod_gzip_on Yes
mod_gzip_minimum_file_size 1002
mod_gzip_maximum_file_size 0
mod_gzip_maximum_inmem_size 60000
mod_gzip_item_include mime "application/x-httpd-php"
mod_gzip_item_include mime text/*
mod_gzip_item_include mime "httpd/unix-directory"
mod_gzip_dechunk Yes
mod_gzip_temp_dir "/tmp"
mod_gzip_keep_workfiles No
mod_gzip_item_include file ".php3$"
mod_gzip_item_include file ".txt$"
mod_gzip_item_include file ".html$"
mod_gzip_item_exclude file ".css$"
mod_gzip_item_exclude file ".js$"
在保存修改後運行
…/bin/apachectl configtest確保配置修改無誤。
然後用apachectl restart 指令重起服務。
修改,測試
在宣布做好了之前在測試一下是優秀程式設計師的習慣。為了儘量不影響你的用戶的瀏覽,我們可以用把新的apache驅動在8080連線埠上或者用指令控制mod_gzip起作用的目錄,而不是一下子全用mod_gzip.
用法如下:
MOD_GZIP configuration
沒有問題後你就可以讓你的用戶很開心的發現’XX網站現在好快喔。’
Mod_gzip真的很神奇,100K的HTML大 文檔只要12K就可以傳到用戶端了。越先採用這個技術你的用戶對你的網站的高速度印象就越深。不過有所得必有所失,由於解壓是在客戶端進行的,效果和用戶 的瀏覽器有一定關係。
2、ⅡS啟用gzip
現代的瀏覽器IE6和Firefox都支持客戶端Gzip,也就是說,在伺服器上的網頁,傳輸之前,先使用Gzip壓縮再傳輸給客戶端,客戶端接收之後由瀏覽器解壓顯示,這樣雖然稍微占用了一些伺服器和客戶端的CPU,但是換來的是更高的頻寬利用率。對於純文本來講,壓縮率是相當可觀的。如果每個用戶節約50%的頻寬,那么你租用來的那點頻寬就可以服務多一倍的客戶了。
ⅡS6已經內建了Gzip壓縮的支持,可惜,沒有設定更好的管理界面。所以要打開這個選項,還要費些功夫。
在伺服器中新建一個資料夾,名稱任意,給本機用戶添加寫入許可權。
進入IIS管理器,IIS管理器>網站 右鍵進入“屬性”面板,切換到“服務”選項卡,勾選HTTP壓縮中兩項,如果僅僅想壓縮靜態檔案,那么第一項就算了。臨時目錄就是剛才新建的那個資料夾。
確認後進入IIS管理器>Web服務擴展,點擊“添加一個新的Web服務擴展”,在彈出的面板中首先輸入擴展名,名稱任意;然後在“要求的檔案”中添加檔案,其實就是輸入gzip.dll所在的路徑。如果不是特立獨行的伺服器,那么這個位置基本上就是“C:WINDOWSsystem32inetsrvgzip.dll”,確認後記得將“設定擴展狀態為允許”勾選。
進入C:WINDOWSsystem32inetsrv這個目錄下,找到一個叫MetaBase.xml的檔案,直接修改保存是不行的,因為IIS服務正在使用該檔案。強烈建議先備份該檔案,再在一個副本上修改。用文本編輯器打開副本,用查找功能找到“IIsCompressionScheme”,共有3處,都在一起,分別是deflate、gzip和Parameters,deflate也是一種壓縮格式,不過性能上不如gzip。需要修改的是deflate和gzip這兩段,參數基本一樣,都要修改。
HcDynamicCompressionLevel是用來設定壓縮率,默認是0,最高是10。低壓縮級別生成稍大一些的壓縮檔案,但對 CPU 和記憶體資源的總體影響較小。高壓縮級別通常會生成較小的壓縮檔案,但會占用較多的 CPU 時間和記憶體。有人說設定成9性價比最高。
HcFileExtensions是用來設定壓縮的靜態檔案擴展名,默認是htm、html、txt,根據網站的自身情況添加擴展名,最基本的是js、css。添加時注意原有的換行格式。
HcScriptFileExtensions是用來設定壓縮的動態檔案擴展名,默認是asp、dll和exe,根據需要自行添加擴展名,無外乎aspx、php等。可以將這一項的默認刪除留空,這樣所有的動態回響都以壓縮方式傳送。另外,還將動態壓縮 HcFileExtensions 中所有未指定的靜態檔案類型,並且因此不將它們放入快取。同樣地,必須將 HcDoDynamicCompression 設定為 true,以進行動態壓縮。
把IIS服務停止,用剛才保存的副本替換原有的MetaBase.xml
重啟IIS服務,如果一切正確,那么Gzip就啟動了。
可以在這個地址檢測Gzip的工作情況。
置檔案在windows目錄下的system32/inetsrv/metabase.xml
找到"/LM/W3SVC/Filters/Compression/deflate"和Location ="/LM/W3SVC/Filters/Compression/gzip"
兩個配置段內均有HcDynamicCompressionLevel="5",請選擇你認為合適的數值,這裡我設定的是5.
如果要對動態網頁進行壓縮,則要修改如下配置項
HcScriptFileExtensions="asp
dll
exe"
將你要壓縮的檔案的擴展名填進去就可以了。
特別提示:這種壓縮最佳化流量的方法,對於文本檔案比較有效,大約能壓縮50%(我一個200k左右的頁面包含js和css壓縮後118k左右),圖片則效果很差。另外壓縮比高對於伺服器來說也會導致cpu負載過高,所以建議不要設定太高的壓縮比。
修改配置檔案時請暫停IIS服務,保存後重新啟動服務即可。
用Nginx的gzip模組提升網站訪問效率
Nginx自帶的有gzip模組,這個模組支持線上實時壓縮輸出數據流。經過良好的配置最佳化,可以大幅的提升網站的輸出效率。
效果顯而易見。
指令
[#gzip gzip] [#gzip_buffers gzip_buffers] [#gzip_comp_level gzip_comp_level] [#gzip_min_length gzip_min_length] [#gzip_http_version gzip_http_version] [#gzip_proxied gzip_proxied] [#gzip_types gzip_types]
指令詳解
gzip
語法: gzip on|off
默認值: gzip off
作用域: http,server,location,if (x) location
開啟或者關閉gzip模組
gzip_buffers
語法: gzip_buffers number size
默認值: gzip_buffers 4 4k/8k
作用域: http,server,location
設定系統獲取幾個單位的快取用於存儲gzip的壓縮結果數據流。例如 4 4k 代表以4k為單位,按照原始數據大小以4k為單位的4倍申請記憶體。4 8k 代表以8k為單位,按照原始數據大小以8k為單位的4倍申請記憶體。
如果沒有設定,默認值是申請跟原始數據相同大小的記憶體空間去存儲gzip壓縮結果。
gzip_comp_level
語法: gzip_comp_level 1..9
默認值: gzip_comp_level 1
作用域: http,server,location
gzip壓縮比,1 壓縮比最小處理速度最快,9 壓縮比最大但處理最慢(傳輸快但比較消耗cpu)。
gzip_min_length
語法: gzip_min_length length
默認值: gzip_min_length 0
作用域: http,server,location
設定允許壓縮的頁面最小位元組數,頁面位元組數從header頭中的Content-Length中進行獲取。
默認值是0,不管頁面多大都壓縮。
建議設定成大於1k的位元組數,小於1k可能會越壓越大。即: gzip_min_length 1024
gzip_http_version
語法: gzip_http_version 1.0|1.1
默認值: gzip_http_version 1.1
作用域: http,server,location
識別http的協定版本。由於早期的一些瀏覽器或者http客戶端,可能不支持gzip自解壓,用戶就會看到亂碼,所以做一些判斷還是有必要的。註:21世紀都來了,現在除了類似於百度的蜘蛛之類的東西不支持自解壓,99.99%的瀏覽器基本上都支持gzip解壓了,所以可以不用設這個值,保持系統默認即可。
gzip_proxied
語法: gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any] ...
默認值: gzip_proxied off
作用域: http,server,location
Nginx作為反向代理的時候啟用,開啟或者關閉後端伺服器返回的結果,匹配的前提是後端伺服器必須要返回包含"Via"的 header頭。
off - 關閉所有的代理結果數據的壓縮 expired - 啟用壓縮,如果header頭中包含 "Expires" 頭信息 no-cache - 啟用壓縮,如果header頭中包含 "Cache-Control:no-cache" 頭信息 no-store - 啟用壓縮,如果header頭中包含 "Cache-Control:no-store" 頭信息 private - 啟用壓縮,如果header頭中包含 "Cache-Control:private" 頭信息 no_last_modified - 啟用壓縮,如果header頭中不包含 "Last-Modified" 頭信息 no_etag - 啟用壓縮,如果header頭中不包含 "ETag" 頭信息 auth - 啟用壓縮,如果header頭中包含 "Authorization" 頭信息 any - 無條件啟用壓縮
gzip_types
語法: gzip_types mime-type [mime-type ...]
默認值: gzip_types text/html
作用域: http,server,location
匹配MIME類型進行壓縮,(無論是否指定)"text/html"類型總是會被壓縮的。
注意:如果作為http server來使用,主配置檔案中要包含檔案類型配置檔案
http{ include conf/mime.types; ......}
如果你希望壓縮常規的檔案類型,可以寫成這個樣子
http {
include conf/mime.types;
gzip on;: gzip_min_length 1000;
gzip_buffers 4 8k; : gzip_http_version 1.1;
gzip_types text/plain application/x-javascript text/css text/html application/xml;
......
}