1. 程式人生 > 其它 >使用Brotli提高網站訪問速度

使用Brotli提高網站訪問速度

在優化網站開啟速度上,我們有很多的方法,而其中一個就是減少諸如Javascript和CSS等資原始檔的大小,而減少檔案大小的方法除了在程式碼上下功夫外,最常用的方法就是使用壓縮演算法對檔案進行壓縮。

目前,網站普遍使用的是gzip壓縮演算法,當然你可能還知道deflatesdch演算法,但是最近兩年新興了一個新的壓縮演算法:Brotli,下面我將會對這個演算法進行簡單的介紹。

什麼是Brotli

Brotli最初發佈於2015年,用於網路字型的離線壓縮。Google軟體工程師在2015年9月釋出了包含通用無損資料壓縮的Brotli增強版本,特別側重於HTTP壓縮。其中的編碼器被部分改寫以提高壓縮比,編碼器和解碼器都提高了速度,流式API已被改進,增加更多壓縮質量級別。新版本還展現了跨平臺的效能改進,以及減少解碼所需的記憶體。

與常見的通用壓縮演算法不同,Brotli使用一個預定義的120千位元組字典。該字典包含超過13000個常用單詞、短語和其他子字串,這些來自一個文字和HTML文件的大型語料庫。預定義的演算法可以提升較小檔案的壓縮密度。

使用brotli取代deflate來對文字檔案壓縮通常可以增加20%的壓縮密度,而壓縮與解壓縮速度則大致不變。

瀏覽器支援情況

  • Chrome從版本49開始支援,但是完整的支援是在版本50(2016年5月27日開始支援)。

  • Firefox從版本52開始支援。

  • IE全版本不支援,但是Edge從版本15開始支援。

  • Safari全系不支援。

  • Opera從版本44開始支援。

支援Brotli壓縮演算法的瀏覽器使用的內容編碼型別為br

,例如以下是Chrome瀏覽器請求頭裡Accept-Encoding的值:

Accept-Encoding: gzip, deflate, sdch, br

如果服務端支援Brotli演算法,則會返回以下的響應頭:

Content-Encoding: br

需要注意的是,只有在HTTPS的情況下,瀏覽器才會傳送br這個Accept-Encoding。

關於效能

下面是LinkedIn做的一個性能測試結果:

AlgorithmQualityCompression Time (ms)Decompression Time (ms)
gzip 6 169 35
gzip 9 284 27
zopfli 15 37,847 32
zopfli 100 194,460 38
zopfli 1000 1,855,480 29
brotli 4 109 24
brotli 5 193 20
brotli 5 517 23
brotli 11 11,913 22

可以看到,Brotli的壓縮率更高,意味著通過Brotli演算法壓縮的檔案,檔案大小更小,但是由表格可以看到,Brotli的壓縮時間比gzip要多,而解壓時間則相當。所以在執行中(on-the-fly)使用Brotli演算法壓縮檔案可能並不是一個很好的方案,下面我們再探討下。

更多的評測可以看以下兩個連結:

使用Brotli

Brotli有更高的壓縮率,但是同時也需要更長的壓縮時間,所以在請求的時候實時進行壓縮並不是一個很好的實踐(當然你可以這麼做)。我們可以預先對靜態檔案進行壓縮,然後直接提供給客戶端,這樣我們就避免了Brotli壓縮效率低的問題,同時使用這個方式,我們可以使用壓縮質量最高的等級去壓縮檔案,最大程度的去減小檔案的大小。

另外,由於不是所有瀏覽器都支援Brotli演算法,所以在服務端,我們需要同時提供兩種檔案,一個是經過Brotli壓縮的檔案,一個是原始檔案,在瀏覽器不支援Brotli的情況下,我們可以使用gzip去壓縮原始檔案提供給客戶端。

具體的實現可以參照下Linkin的這篇文章:https://engineering.linkedin....

在Nginx上啟用Brotli

nginx目前並不支援Brotli演算法,需要使用第三方模組,例如ngx_brotli進行實現。下面是簡單的安裝步驟。

安裝及配置

下載ngx_brotli模組及其依賴:

$ git clone https://github.com/google/ngx_brotli
$ cd ngx_brotli
$ git submodule update --init

編譯Nginx時加入ngx_brotli模組:

$ cd /path/to/nginx_source/
$ ./configure --add-module=/path/to/ngx_brotli
$ make && make install

在Nginx配置檔案的http塊下增加以下指令:

brotli               on;  
brotli_comp_level    6;  
brotli_buffers       16 8k;  
brotli_min_length    20;  
brotli_types         *;

以上是on-the-fly的配置方式,如果是要響應已經使用Brotli壓縮過的檔案,則使用brotli_static指令。下面是ngx_brotli模組相關指令的一些簡單解析。

模組指令解析

brotli_static

啟用後將會檢查是否存在帶有br擴充套件的預先壓縮過的檔案。如果值為always,則總是使用壓縮過的檔案,而不判斷瀏覽器是否支援。

brotli

是否啟用在on-the-fly方式壓縮檔案,啟用後,將會在響應時對檔案進行壓縮並返回。

brotli_types

指定對哪些內容編碼型別進行壓縮。text/html內容總是會被進行壓縮。

brotli_buffers

設定緩衝的數量和大小。大小預設為一個記憶體頁的大小,也就是4k或者8k

brotli_comp_level

設定壓縮質量等級。取值範圍是0到11.

brotli_window

設定視窗大小。

brotli_min_length

設定需要進行壓縮的最小響應大小。

具體資訊請參看:https://github.com/google/ngx...

參考

轉自https://segmentfault.com/a/1190000009374437