在介绍 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算法
从上面的内容了解到,咱们控制使用压缩的资源,除了有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/