在優化網站打開速度上,咱們有不少的方法,而其中一個就是減小諸如Javascript和CSS等資源文件的大小,而減小文件大小的方法除了在代碼上下功夫外,最經常使用的方法就是使用壓縮算法對文件進行壓縮。html
目前,網站廣泛使用的是gzip
壓縮算法,固然你可能還知道deflate
和sdch
算法,可是最近兩年新興了一個新的壓縮算法:Brotli,下面我將會對這個算法進行簡單的介紹。nginx
Brotli最初發佈於2015年,用於網絡字體的離線壓縮。Google軟件工程師在2015年9月發佈了包含通用無損數據壓縮的Brotli加強版本,特別側重於HTTP壓縮。其中的編碼器被部分改寫以提升壓縮比,編碼器和解碼器都提升了速度,流式API已被改進,增長更多壓縮質量級別。新版本還展示了跨平臺的性能改進,以及減小解碼所需的內存。git
與常見的通用壓縮算法不一樣,Brotli使用一個預約義的120千字節字典。該字典包含超過13000個經常使用單詞、短語和其餘子字符串,這些來自一個文本和HTML文檔的大型語料庫。預約義的算法能夠提高較小文件的壓縮密度。github
使用brotli取代deflate來對文本文件壓縮一般能夠增長20%的壓縮密度,而壓縮與解壓縮速度則大體不變。web
Chrome從版本49開始支持,可是完整的支持是在版本50(2016年5月27日開始支持)。算法
Firefox從版本52開始支持。瀏覽器
IE全版本不支持,可是Edge從版本15開始支持。bash
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的狀況下,咱們可使用gzip去壓縮原始文件提供給客戶端。
具體的實現能夠參照下Linkin的這篇文章:https://engineering.linkedin....。
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
模塊相關指令的一些簡單解析。
啓用後將會檢查是否存在帶有br
擴展的預先壓縮過的文件。若是值爲always
,則老是使用壓縮過的文件,而不判斷瀏覽器是否支持。
是否啓用在on-the-fly方式壓縮文件,啓用後,將會在響應時對文件進行壓縮並返回。
指定對哪些內容編碼類型進行壓縮。text/html
內容老是會被進行壓縮。
設置緩衝的數量和大小。大小默認爲一個內存頁的大小,也就是4k
或者8k
。
設置壓縮質量等級。取值範圍是0到11.
設置窗口大小。
設置須要進行壓縮的最小響應大小。
具體信息請參看:https://github.com/google/ngx...