使用Brotli提高網站訪問速度
在優化網站打開速度上,我們有很多的方法,而其中一個就是減少諸如Javascript和CSS等資源文件的大小,而減少文件大小的方法除了在代碼上下功夫外,最常用的方法就是使用壓縮算法對文件進行壓縮。
目前,網站普遍使用的是gzip
壓縮算法,當然你可能還知道deflate
和sdch
算法,但是最近兩年新興了一個新的壓縮算法: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做的一個性能測試結果:
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...
參考
喜歡這篇文章?歡迎打賞~~