把Gzip換成Brotli的Nginx配置教程

內容協商

在介紹 Brotli 以前,先說一下 HTTP 內容協商javascript

有時候,同一個 URL 能夠提供多份不一樣的文檔,這就要求服務端和客戶端之間有一個選擇最合適版本的機制,這就是內容協商css

HTTP 的內容協商的其中一種方式:服務端根據客戶端發送的請求頭中某些字段自動發送最合適的版本。能夠用於這個機制的請求頭字段又分兩種:內容協商專用字段(Accept 字段)、其餘字段html

字段狀況,詳見下表:java

請求頭字段 說明 響應頭字段
Accept 告知服務器發送何種媒體類型 Content-Type
Accept-Language 告知服務器發送何種語言 Content-Language
Accept-Charset 告知服務器發送何種字符集 Content-Type
Accept-Encoding 告知服務器採用何種壓縮方式 Content-Encoding

例如客戶端發送如下請求頭:nginx

Accept-Encoding:gzip,deflate,br

表示支持採用 gzip、deflate 或 br 壓縮過的資源git

瀏覽器的響應頭多是這樣的:github

Content-Encoding: gzip

詳情可參考:Here算法

什麼是 Brotli

從上面的內容瞭解到,咱們控制使用壓縮的資源,除了有Gzip外,還有br,而這個br就是我這裏要說的 Brotlichrome

Brotli is a generic-purpose lossless compression algorithm that compresses data using a combination of a modern variant of the LZ77 algorithm, Huffman coding and 2nd order context modeling, with a compression ratio comparable to the best currently available general-purpose compression methods. It is similar in speed with deflate but offers more dense compression.json

Brotli 是基於LZ77算法的一個現代變體、霍夫曼編碼和二階上下文建模。Google軟件工程師在2015年9月發佈了包含通用無損數據壓縮的Brotli加強版本,特別側重於HTTP壓縮。其中的編碼器被部分改寫以提升壓縮比,編碼器和解碼器都提升了速度,流式API已被改進,增長更多壓縮質量級別。

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

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

瀏覽器支持狀況

  • Mozilla Firefox在Firefox 44中實現Brotli。

  • Google Chrome從Chrome 49開始支持Brotli。

  • Opera從Opera 36開始支持Brotli。

安裝與配置過程

安裝須要用到開發工具

CentOS,以下

yum groupinstall 'Development Tools'

Ubuntu,以下

sudo apt-get install autoconf libtool automake

此次的教程實踐環境是CentOS 7,已經在linpx.com上實現了

下面開始正式的教程

安裝libbrotli

cd /usr/local/src/
git clone https://github.com/bagder/libbrotli
cd libbrotli
./autogen.sh
./configure
make && make install

安裝ngx_brotli

cd /usr/local/src/
git clone https://github.com/google/ngx_brotli
cd ngx_brotli && git submodule update --init

下載Nginx

這裏使用 nginx-1.10.3

cd /usr/local/src
wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar -xvzf nginx-1.10.3.tar.gz && rm -rf nginx-1.10.3.tar.gz

獲取Nginx Arguments

nginx -V

整理新的Arguments

根據獲取到的configure arguments和上面軟件的位置,從新整理configure arguments

而後再加上 --add-module=/usr/local/src/ngx_brotli

開始安裝和編譯

cd /usr/local/src/nginx-1.10.3
./configure [這裏是你的原Arguments] --add-module=/usr/local/src/ngx_brotli
make && make install

檢查是否安裝正常

nginx -V
nginx -t

找到Nginx的全局配置文件

若是檢測安裝正常的話,能夠開始配置,該配置文件通常爲 nginx.conf

在合適的位置插入下面代碼

#Brotli Compression
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

再次檢測是否正常

nginx -t

重啓Nginx

若是正常的話,恭喜你,你已經配置完成了,重啓一下Nginx便可

CentOS 6.x:

service nginx restart

CentOS 7.x:

systemctl restart nginx

檢查是否生效

打開你的網頁,用chrome開發者工具調試,在Network那,發現有content-encoding:br

可能的報錯

若是在測試或者重載時, Nginx 報錯以下:

nginx: error while loading shared libraries: libbrotlienc.so.1: cannot open shared object file: No such file or directory

解決方法是把對應的庫文件在 /lib(64) 或者 /usr/lib(64) 中作上軟連接:

# 64 位系統
$ ln -s /usr/local/lib/libbrotlienc.so.1 /lib64

# 32 位系統
$ ln -s /usr/local/lib/libbrotlienc.so.1 /lib

結論

一週前就已經完成配置和實踐,拖到今天才寫完。。。

另外,把Gzip換成br,真的能夠感覺到速度明顯提高了。。。

內容較多,大概就這樣。。。

對了,文章首發於 www.linpx.com,歡迎你們多多訪問個人博客,謝謝

參考

  • imququ.com/post/my-nginx-conf.html

  • wangqiliang.com/qi-yong-brotli-ya-suo-suan-fa-ti-gao-xing-neng/

  • zh.wikipedia.org/wiki/Brotli

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

相關文章
相關標籤/搜索