使用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做的一個性能測試結果:

enter image description here

Algorithm Quality Compression 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...

參考

 
 

喜歡這篇文章?歡迎打賞~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM