減少文件大小有兩個明顯的好處,一是可以減少存儲空間,二是通過網絡傳輸文件時,可以減少傳輸的時間。gzip 是在 Linux 系統中經常使用的一個對文件進行壓縮和解壓縮的命令,既方便又好用。今天具體講解以下知識點:
1、與壓縮有關的HTTP首部字段
2、壓縮的幾種方式
3、nginx中如何配置
關注下面兩個值
1、response headers中的content-encoding
2、request headers 中的accept-encoding
content-encoding是指網頁使用了哪種壓縮方式傳輸數據給你,accept-encoding表示你發送請求時告訴服務器,我可以解壓這些格式的數據。
二者的關係是,對方網頁會根據你發送的accept-encoding來決定用什麼格式content-encoding傳給你。
語法
Accept-Encoding: gzip
Accept-Encoding: compress
Accept-Encoding: deflate
Accept-Encoding: br
Accept-Encoding: identity
Accept-Encoding: *
// Multiple algorithms, weighted with the quality value syntax:
Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5
1、gzip
使用 Lempel-Ziv 編碼( LZ77 )的壓縮格式,帶有32位 CRC 。
2、compress
使用 Lempel-Ziv-Welch( LZW )算法的壓縮格式。
3、deflate
使用 zlib 結構的壓縮格式,以及 deflate 壓縮算法。
4、br
使用 Brotli 算法的壓縮格式。
5、dentity
指示身份功能(即不壓縮,也不修改)。即使不存在,該值始終被認爲是可以接受的。
若想要增加優先級,則使用 q=
來額外表示權重值 ,用分號(;
)進行分隔。權重值 q
的範圍是 0~1(可精確到小數點後 3 位),且 1 爲最大值。不指定權重 q
值時,默認權重爲 q=1.0
。
另外,也可使用星號(*
)作爲通配符,指定任意的編碼格式。
例子
Accept-Encoding: gzip
Accept-Encoding: gzip, compress, br
Accept-Encoding: br;q=1.0, gzip;q=0.8, *;q=0.1
HTTP協議上的GZIP編碼是一種用來改進WEB應用程序性能的技術。大流量的WEB站點常常使用GZIP壓縮技術來讓用戶感受更快的速度。一般對純文本內容可壓縮到原大小的40%,這樣傳輸就快了,效果就是你點擊網址後會很快的顯示出來,當然這也會增加服務器的負載. 一般服務器中都安裝有這個功能模塊的。
compress這個命令纔是真正沒什麼用的命令,因爲用compress命令壓縮的文件可以用gzip解壓,但是gzip壓縮的文件卻不能用uncompress命令解壓。而且compress是一個非常老的工具,只有在非常舊的系統上纔有,新版的系統上沒有,還要額外安裝,但是compress命令的壓縮比又比不上gzip,誰會安裝一個compress命令來用呢。
zlib和gzip都只是一種壓縮格式,數據具體壓縮成什麼樣,要看用的什麼壓縮算法,gzip目前只有deflate一種壓縮算法,zlib有多種,但默認也使用deflate。
使用brotli替換deflate來對文本文件壓縮通常可以增加20%的壓縮密度,而壓縮與解壓縮速度則大致不變。使用Brotli進行流壓縮的內容編碼類型已被提議使用“br”。
Brotli有更高的壓縮率,但是同時也需要更長的壓縮時間,所以在請求的時候實時進行壓縮並不是一個很好的實踐(當然你可以這麼做)。我們可以預先對靜態文件進行壓縮,然後直接提供給客戶端,這樣我們就避免了Brotli壓縮效率低的問題,同時使用這個方式,我們可以使用壓縮質量最高的等級去壓縮文件,最大程度的去減小文件的大小。
另外,由於不是所有瀏覽器都支持Brotli算法,所以在服務端,我們需要同時提供兩種文件,一個是經過Brotli壓縮的文件,一個是原始文件,在瀏覽器不支持Brotli的情況下,我們可以使用gzip去壓縮原始文件提供給客戶端。
配置
一般我們都是React和Vue項目最終打包之後都是html,css,js這樣的靜態文件,部署的話一般都是使用nginx作爲靜態資源服務器。那麼簡單介紹一下nginx如何配置壓縮。
配置:/etc/nginx/conf.d/default.conf
location ~ .*\.(html|js|css)$ {
gzip on; #啓用壓縮
gzip_min_length 1k; #只壓縮超過1K的文件
gzip_http_version 1.1; #啓用gzip壓縮所需的HTTP最低版本
gzip_comp_level 9; #壓縮級別,壓縮比率越高,文件被壓縮的體積越小
gzip_types text/css application/javascript;#進行壓縮的文件類型
root /data/www/html;
}
Google都提供了Brotli的Nginx模塊. 我們可以自行編譯來加入對Brotli的支持.,整個過程和配置其他模塊沒有太大的區別, 這裏就簡要地記錄一下.
# 修改配置文件, 參數和Gzip大致相同
brotli on;
brotli_static off;
brotli_types text/css application/javascript;
brotli_buffers 4 16k;
brotli_comp_level 6;
brotli_window 512k;
brotli_min_length 512;
參考資料:使用Brotli提高網站訪問速度