使用Brotli提升網站訪問速度

使用Brotli提升網站訪問速度

在優化網站打開速度上,咱們有不少的方法,而其中一個就是減小諸如Javascript和CSS等資源文件的大小,而減小文件大小的方法除了在代碼上下功夫外,最經常使用的方法就是使用壓縮算法對文件進行壓縮。html

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

什麼是Brotli

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

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...

參考

相關文章
相關標籤/搜索