Nginx开启Brotli压缩算法实现过程详解


Posted in Servers onMarch 31, 2021

前言

在web应用中,为了节省流量,降低传输数据大小,提高传输效率,常用的压缩方式一般都是gzip,今天我们来介绍另外一种更高效的压缩方式brotli。

Brotli 是基于LZ77算法的一个现代变体、霍夫曼编码和二阶上下文建模。Google软件工程师在2015年9月发布了包含通用无损数据压缩的Brotli增强版本,特别侧重于HTTP压缩。

注意:使用算法的前提是启用了 https,因为 http 请求中 request header 里的 Accept-Encoding: gzip, deflate 是没有 br 的。
关于Brotli 算法详细请查看:https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Brotli

浏览器对brotli协议的支持

Nginx开启Brotli压缩算法实现过程详解

各种压缩算法的在不同level下的比较

Nginx开启Brotli压缩算法实现过程详解

从图中可以看出brotli vs gzip 的压缩算法 总体来说brotli的总体性能更好,尤其是解压速度。我们在选择brotli算法或gzip时,需要根据实际场景进行调优

下载Brotli

google/ngx_brotli 从 16年12月的版本起,开始内置google/brotli,所以我们不需要额外编译bagder/libbrotli库,让安装变得简单起来。 我们将google/ngx_brotli下载并解压到/usr/src/ngx_brotli目录

cd /usr/src

git clone https://github.com/google/ngx_brotli.git

然后在下载google/brotli并解压到/usr/src/ngx_brotli/deps/brotli

cd /usr/src/ngx_brotli/deps && rm -rf brotli
git clone git@github.com:google/brotli.git
cd /usr/src/ngx_brotli && git submodule update --init

编译Brotli

nginx自1.9.11以后版本后支持动态模块,自此,给nginx添加模块再也不用重新编译nginx了,通过动态模块,你可以在运行时有有选择性的加载第三方或Nginx官方模块。新的实现方式通过API模块保持尽可能的向后兼容。

下载解压nginx安装包

请下载与当前nginx版本相同的nginx安装包。nginx官方下载地址:http://nginx.org/en/download.html。 这里假设当前服务器nginx是1.14.2版本。

可通过命令,获取当前nginx版本

nginx -v

输出

nginx version: nginx/1.14.2

下载nginx安装包

cd /usr/src
wget http://59.80.44.46/nginx.org/download/nginx-1.14.2.tar.gz

解压安装包

tar -xvf nginx-1.14.2.tar.gz

编译动态模块

先进入解压后的nginx安装包目录,配置configure,然后用make modules。

cd nginx-1.14.2
./configure --with-compat --add-dynamic-module=/usr/src/ngx_brotli
make modules

参数语法:--add-dynamic-module=[模块源码所在目录的绝对路径]

等运行完成后,查看编译好的模块

ls objs/*.so

输出:

objs/ngx_http_brotli_filter_module.so objs/ngx_http_brotli_static_module.so

将编译好的模块文件复制到nginx动态模块加载目录

cp objs/{ngx_http_brotli_filter_module.so,ngx_http_brotli_static_module.so} /etc/nginx/modules

注册Brotli模块

为了方便管理nginx动态模块,建议新建一个modules.conf文件,单独管理动态模块。

touch /etc/nginx/modules.conf

在/etc/nginx/nginx.conf配置文件里引入modules.conf文件,找到以下内容并修改:

pid /var/run/nginx.pid;

include /etc/nginx/modules.conf;

打开/etc/nginx/modules.conf,注册刚才编译好的 Brotli 模块。

# Brotli模块
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

启用Brotli压缩

Brotli和gzip是可以并存的,无需关闭gzip。

在/etc/nginx/nginx.conf开启Brotli:

http {
  ...
  # gzip
  gzip on;
  gzip_min_length 1k;
  gzip_buffers 4 32k;
  gzip_http_version 1.1;
  gzip_comp_level 5;
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
  gzip_vary on;
  gzip_proxied any;
  gzip_disable "MSIE [1-6]\.";

  # brotli
  brotli on;
  brotli_comp_level 6;
  brotli_buffers 16 8k;
  brotli_min_length 20;
  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;
  ...
}

gzip与brotli的配置详情

gzip调优
使用gzip压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本,所以说这是一个重点。 关于gzip详细介绍可点击这里;

gzip on 开启gzip压缩功能。

gzip_min_length 1k

设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是 0 ,不管页面多大都进行压缩,建议设置成大于 1K ,如果小与1K可能会越压越大。

gzip_buffers

压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。

gzip_http_version 1.1

压缩版本,用于设置识别HTTP协议版本,默认是 1.1 ,目前大部分浏览器已经支持GZIP解压,使用默认即可。

gzip_comp_level 5

压缩比例,用来指定gzip压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。推荐设置为 5 。

gzip_types

用来指定压缩的类型,text/html类型总是会被压缩。

gzip_vary on

和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩。

gzip_proxied any

nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含Via的header头。默认是 off 。 可选参数值:

  • off 关闭所有的代理结果数据的压缩
  • expired 启用压缩,如果header头中包含 Expires 头信息
  • no-cache 启用压缩,如果header头中包含 Cache-Control:no-cache 头信息
  • no-store 启用压缩,如果header头中包含 Cache-Control:no-store 头信息
  • private 启用压缩,如果header头中包含 Cache-Control:private 头信息
  • no_last_modified 启用压缩,如果header头中不包含 Last-Modified 头信息
  • no_etag 启用压缩 ,如果header头中不包含 ETag 头信息
  • auth 启用压缩 , 如果header头中包含 Authorization 头信息
  • any 无条件启用压缩

gzip_disable

禁用IE6的gzip压缩。 IE6对gzip的压缩支持很不好,会造成页面的假死。为了避免IE6出现问题,建议加上这个参数。

brotli调优

Google 认为互联网用户的时间是宝贵的,他们的时间不应该消耗在漫长的网页加载中,因此在 2015 年 9 月 Google 推出了无损压缩算法 Brotli。Brotli 通过变种的 LZ77 算法、Huffman 编码以及二阶文本建模等方式进行数据压缩,与其他压缩算法相比,它有着更高的压塑压缩效率。 关于brotli详细介绍可点击这里;

注:如果未安装brotli模块,此部分配置项无需配置,可略过。

brotli on

开启brotli压缩功能。

brotli_comp_level 6

压缩比例,用来指定brotli压缩比,1 压缩比最小,处理速度最快,11 压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。默认值为 6 ,使用默认值即可。

brotli_buffers 16 8k

设置用于压缩响应的缓冲区number和size。默认情况下,缓冲区大小等于一个内存页面。 默认值:32 4k|16 8k。

brotli_min_length 20

设置length要压缩的响应的最小值,长度仅由Content-Length响应头字段确定。默认为 20 。

brotli_types

用来指定压缩的类型,text/html类型总是会被压缩。

gzip与brotli的配置详情在反向代理配置文件代码中添加:

proxy_set_header Accept-Encoding "";

范例:

server {
  ...
  location / {
    ...
    proxy_set_header Accept-Encoding "";
    ...
  }
  ...
}

重启nginx,使其配置生效

systemctl restart nginx

Brotli 压缩只能在https中生效,因为 在 http 请求中 request header 里的 Accept-Encoding: gzip, deflate 是没有 br 的。
清理临时文件

要养成好习惯,每次编译完后都要把应用包解压出来的文件或目录进行删除。

rm -rf /usr/src/{nginx-1.14.2/,ngx_brotli/}

最后检查是否生效

打开网页,用chrome开发者工具调试,在Network一栏会发现有content-encoding:br,同时网络耗时也会明显减少。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Servers 相关文章推荐
Nginx的rewrite模块详解
Mar 31 Servers
Nginx快速入门教程
Mar 31 Servers
使用kubeadm命令行工具创建kubernetes集群
Mar 31 Servers
docker-compose部署Yapi的方法
Apr 08 Servers
Consul在linux环境的集群部署
Apr 08 Servers
Tomcat配置访问日志和线程数
May 06 Servers
GPU服务器的多用户配置方法
Jul 07 Servers
Linux安装Docker详细教程
Jul 07 Servers
Windows server 2003卸载和安装IIS的图文教程
Jul 15 Servers
阿里云服务器(windows)手动部署FTP站点详细教程
Aug 05 Servers
服务器nginx权限被拒绝解决案例
Sep 23 Servers
Nginx配置SSL证书出错解决方案
Mar 31 #Servers
Nginx配置并兼容HTTP实现代码解析
Mar 31 #Servers
基于Nginx实现限制某IP短时间访问次数
Mar 31 #Servers
Nginx tp3.2.3 404问题解决方案
Mar 31 #Servers
解决Nginx 配置 proxy_pass 后 返回404问题
nginx配置ssl实现https的方法示例
Mar 31 #Servers
Nginx解决前端访问资源跨域问题的方法详解
Mar 31 #Servers
You might like
ThinkPHP模板循环输出Volist标签用法实例详解
2016/03/23 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
php array_chunk()函数用法与注意事项
2019/07/12 PHP
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
轻量级javascript 框架Backbone使用指南
2015/07/24 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
mongoose设置unique不生效问题的解决及如何移除unique的限制
2017/11/07 Javascript
详解JS转换数值函数Number()、parseInt()、parseFloat()
2018/08/24 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
vue中的mescroll搜索运用及各种填坑处理
2019/10/30 Javascript
vue与django集成打包的实现方法
2019/11/11 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
Python3字符串学习教程
2015/08/20 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
2018/02/07 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
雅诗兰黛香港官网:Estee Lauder香港
2017/09/26 全球购物
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
制药工程专业应届生求职信
2013/09/24 职场文书
应聘面试自我评价
2014/01/24 职场文书
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
统计工作个人总结
2015/03/03 职场文书
开学第一周总结
2015/07/16 职场文书
Redis实战高并发之扣减库存项目
2022/04/14 Redis