HTTP資源壓縮

減少文件大小有兩個明顯的好處,一是可以減少存儲空間,二是通過網絡傳輸文件時,可以減少傳輸的時間。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提高網站訪問速度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章