Gzip以後繼者Brotli淺析之CDN廠商的智能壓縮,服務器Brotli設置

智能壓縮」按照又拍雲的說法是,同時支持 Gzip 和 Brotli 壓縮算法。根據用於瀏覽器開啓自動選擇不一樣壓縮方式。html

Gzip 壓縮算法

Gzip 基於 DEFLATE 算法,它是 LZ77 和霍夫曼編碼的組合,最先用於 UNIX 系統的文件壓縮。HTTP 協議上的 Gzip 編碼是一種用來進 Web 應用程序性能的技術,Web 服務器和客戶端(瀏覽器)必須共同支持 Gzip,當下主流的瀏覽器都是支持 Gzip 壓縮,包括 IE六、IE七、IE八、IE九、FireFox、Google Chrome、Opera 等。nginx

Brotli 壓縮算法

Google 認爲互聯網用戶的時間是寶貴,尤爲不該該浪費在無用的網頁加載中。git

2013年,他們發佈了 Zotfli 壓縮算法。該算法在默認設置下的輸出比 zlib 的最大壓縮比輸出還要小 3-8%。PNG 優化器、Web 內容預處理等許多壓縮方案中都集成了該算法。基於該算法的應用狀況,於 2015 年 9 月推出了無損壓縮算法 Brotli,最初用於用於網絡字體的離線壓縮。該算法由谷歌壓縮團隊的 Jyrki Alakuijala 和 Zoltan Szabadka 開發,其中 Jyrki 亦是 Zotfli 壓縮算法的建立者。github

2015年9月發佈了包含通用無損數據壓縮的Brotli加強版本,特別側重於HTTP壓縮。其中的編碼器被部分改寫以提升壓縮比,編碼器和解碼器都提升了速度,流式API已被改進,增長更多壓縮質量級別。新版本還展示了跨平臺的性能改進,以及減小解碼所需的內存。web

Brotli 經過變種的 LZ77 算法、Huffman 編碼以及二階文本建模等方式進行數據壓縮,與其餘壓縮算法相比,它有着更高的壓縮效率算法

與常見的通用壓縮算法不一樣,Brotli使用一個預約義的120千字節字典。該字典包含超過13000個經常使用單詞、短語和其餘子字符串,這些來自一個文本和HTML文檔的大型語料庫。預約義的算法能夠提高較小文件的壓縮密度。segmentfault

使用brotli替換deflate來對文本文件壓縮一般能夠增長20%的壓縮密度,而壓縮與解壓縮速度則大體不變。瀏覽器

Brotli 壓縮算法具備多個特色,最典型的是如下 3 個:bash

  • 針對常見的 Web 資源內容,Brotli 的性能相比 Gzip 提升了 17-25%;服務器

  • 當 Brotli 壓縮級別爲 1 時,壓縮率比 Gzip 壓縮等級爲 9(最高)時還要高;

  • 在處理不一樣 HTML 文檔時,Brotli 依然可以提供很是高的壓縮率。

  • 比其餘算法提供更快的解壓與壓縮算法

Brotli算法與其餘算法壓縮比率對比

Brotli算法與其餘算法壓縮比率對比Brotli解壓與壓縮與其餘算法速度對比

圖一,咱們能夠看到 Brotli 與經常使用的壓縮算法 bzip二、gzip、lzma2 對比,壓縮比上有明顯的優點。

圖二,咱們看到 Brotli 的解壓縮速度與 Gzip 很是類似,可是遠遠超出 bzip2 和 lzma2,儘管它們相較於 Gzip 有更好的壓縮比,可是它們解壓縮的速度要慢幾倍,和 Brotli 一比,他們的優點消失殆盡。

Brotli 算法和其餘算法的性能比較:

  • https://cran.r-project.org/web/packages/brotli/vignettes/benchmarks.html

  • https://hacks.mozilla.org/2015/11/better-than-gzip-compression-with-brotli

服務器支持Brotli壓縮算法

支持Brotli壓縮算法的瀏覽器使用的內容編碼類型爲br

http請求頭:Accept-Encoding: gzip, deflate, sdch, br

http返回頭:Content-Encoding: br

在Nginx上啓用Brotli

nginx目前並不支持Brotli算法,須要使用第三方模塊,例如ngx_brotli進行實現。https://github.com/google/ngx_brotli

下面是簡單的安裝步驟。

git clone https://github.com/google/ngx_brotli
cd ngx_brotli
git submodule update --init
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         *;

nginx 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:設置須要進行壓縮的最小響應大小。

如今貼吧化的知乎,就使用了brotli

 

相關文章:

 

轉載本站文章《Gzip以後繼者Brotli淺析之CDN廠商的智能壓縮,服務器Brotli設置》,
請註明出處:https://www.zhoulujun.cn/html/webfront/SGML/web/2020_0125_8255.html

相關文章
相關標籤/搜索