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

前言

在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协议的支持

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

从图中可以看出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,同时网络耗时也会明显减少。

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

(0)

相关推荐

  • Nginx 负载均衡算法及故障转移解析

    概述 Nginx负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡.故障转移.失败重试.容错.健康检查等. 当上游服务器(真实业务逻辑访问的服务器)发生故障时,可以转移到其他上游服务器(真实业务逻辑访问的服务器). 配置 upstream backServer{ server 127.0.0.1:8080; server 127.0.0.1:8081; } server { listen 80; server_name www.itmayiedu.com; location / { #

  • Nginx使用Gzip算法对报文进行压缩详解

    什么是HTTP压缩 有时候客户端和服务器之间会传输比较大的报文数据,这时候就占用较大的网络带宽和时长.为了节省带宽,加速报文的响应速速,可以将传输的报文数据先进行压缩,然后再进行传输. HTTP支持多种报文压缩算法,下面是一个普通的请求头,从Accept-Encoding字段可以看出支持gzip.deflate和br压缩算法.本文我们重点讲使用Gzip算法对报文进行压缩,比如Gzip来压缩HTML,Javascript, CSS文件,压缩完后能大大减少网络传输的数据量,提高了用户显示网页的速度.

  • Nginx启用Brotli算法压缩的示例

    Brotli 是 Google 开发的一种压缩格式,它通过内置分析大量网页得出的字典,实现了更高的压缩比率,同时几乎不影响压缩 / 解压速度. 本站通过 ngx_brotli 模块来让 Nginx 支持 Brotli 压缩方式.本文介绍其配置方式. 安装模块 若要启用 ngx_brotli 模块,需要在编译 Nginx 时,加入相应模块: # get source git clone https://github.com/google/ngx_brotli.git cd ngx_brotli g

  • 为Nginx启用Brotli压缩算法的方法示例

    Brotli是一种全新的数据格式,可以提供比Zopfli高20-26%的压缩比. 什么是 Brotli 压缩算法 Brotli最初发布于2015年,用于网络字体的离线压缩.Google软件工程师在2015年9月发布了包含通用无损数据压缩的Brotli增强版本,特别侧重于HTTP压缩.其中的编码器被部分改写以提高压缩比,编码器和解码器都提高了速度,流式API已被改进,增加更多压缩质量级别.新版本还展现了跨平台的性能改进,以及减少解码所需的内存. 与常见的通用压缩算法不同,Brotli使用一个预定义

  • 详解Nginx轮询算法底层实现的方法

    轮询算法简介 在工作中很多人都使用到了nginx,对nginx得配置也是烂熟于心,今天我主要想介绍一下nginx轮询算法得几种底层实现方式. 简单轮询算法 这种算法比较简单,举个例子就是你有三台服务器 第一台服务器 192.168.1.1 第二台服务器 192.168.1.2 第三台服务器 192.168.1.3 第一个请求过来之后默认访问第一台,第二个请求过来访问第二台,第三次请求过来访问第三台,第四次请求过来访问第一台,以此类推.以下是我代码实现简单得算法: public class Sim

  • 深入浅析nginx四种调度算法和进阶

    upstream 支持4种负载均衡调度算法: A)轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器; B)ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器; C)url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器; D)fair:这是比上面两个更加智能的负载均衡算法.此种算法可以依据页面大小和加载时间长短智能地进 行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配.Nginx本身

  • C#实现Nginx平滑加权轮询算法

    本文实例为大家分享了C#实现Nginx平滑加权轮询算法的具体代码,供大家参考,具体内容如下 代码很简单,算法很经典! 1. 定义实体类 public struct ServerConfig { //初始权重 public int Weight {get;set;} //当前权重 public int Current {get;set;} //服务名称 public string Name {get;set;} } 2. 算法 public static int NextServerIndex(S

  • 简单了解Nginx七层负载均衡的几种调度算法

    这篇文章主要介绍了简单了解Nginx七层负载均衡的几种调度算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Nginx是一款轻量级的高性能web服务器,同时也是一款非常优秀的负载均衡器和反向代理服务器.由于支持强大的正则匹配规则.动静分离.URLrewrite功能及安装配置简单且对网络稳定性依赖非常小等优点,所以常用来做为七层负载均衡使用.在硬件不差的情况下,通常可以稳定支持几万的并发连接,在硬件性能足够好,且对系统内核参数及Nginx配置进

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

    前言 在web应用中,为了节省流量,降低传输数据大小,提高传输效率,常用的压缩方式一般都是gzip,今天我们来介绍另外一种更高效的压缩方式brotli. Brotli 是基于LZ77算法的一个现代变体.霍夫曼编码和二阶上下文建模.Google软件工程师在2015年9月发布了包含通用无损数据压缩的Brotli增强版本,特别侧重于HTTP压缩. 注意:使用算法的前提是启用了 https,因为 http 请求中 request header 里的 Accept-Encoding: gzip, defl

  • 基于nginx设置浏览器协商缓存过程详解

    这篇文章主要介绍了基于nginx设置浏览器协商缓存过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 强缓存与协商缓存的区别 强缓存:浏览器不与服务端协商直接取浏览器缓存 协商缓存:浏览器会先向服务器确认资源的有效性后才决定是从缓存中取资源还是重新获取资源 协商缓存运作原理 现在有一个这样的业务情景:后端的静态资源会不定时地发生更新,而因为浏览器默认使用强缓存,会默认从浏览器缓存中取到过时的资源. 现在我们希望浏览器每次获取资源的时候都向后

  • nginx搭建jsdelivr镜像站过程详解

    目录 创建 jsdelivr 镜像站 使用 jsdelivr 镜像站 ​最近 jsdelivr 可谓国内站长圈的头条常客,这不,又双叒叕(yòu shuāng ruò zhuó)打不开了. 如何解决这个问题?最简单的方法当然是使用别人建立的jsd镜像站,但是稳定性和可靠性就只能看镜像站长的心情了吧.自己动手丰衣足食,还是自己搞个镜像吧. 创建 jsdelivr 镜像站 首先,你需要有一台安装了 nginx 的服务器.推荐使用腾讯云轻量服务器的Matomo镜像,其中集成了最新稳定版 nginx.p

  • centos6.4+nginx+mysql+php+phpmyadmin整合过程详解

    本文实例讲述了centos6.4+nginx+mysql+php+phpmyadmin整合过程.分享给大家供大家参考,具体如下: 装了很多次机,做了很多次重复工作,最后,总结以下装CentOS经验: 注:很多问题其实都不是问题,先把selinux关了!setenforce 0 ,不然会死的很惨! 1. 先更新源 启用国内的源:163或sohu 163:http://mirrors.163.com/.help/centos.html 如果想使用新的软件,建议用REPL和remi的源 #remi的源

  • linux上nginx安装部署及使用过程详解

    1.下载 官网下载地址 2.部署 2.1安装前提 在linux下安装需要安装一下组件 1. gcc && g++ yum install gcc-c++ 2. pcre yum install -y pcre pcre-devel 3. zlib yum install -y zlib zlib-devel 4. openssl yum install -y openssl openssl-devel 2.2 安装 1. 解压nginx文件 tar -zxvf nginx-1.17.5.t

  • nginx搭建图片服务器的过程详解(root和alias的区别)

    安装过程略(我是直接用 yum -y install nginx; 安装的). 启动 启动(重启)nginx,以下2个命令都可以: systemctl restart nginx; # 注:这里的nginx不是目录,是cd不进去的 /usr/sbin/nginx -s reload; 一般不报错就是启动成功. 页面验证nginx是否启动 浏览器输入ip,返回centos页面,这不对吧? 看下配置文件: root /usr/share/nginx/html; 该目录下的index.html 内容就

  • CentOS 7中Nginx日志定时拆分实现过程详解

    一.编写拆分脚本(splitNginxLog.sh) * 因为本例中设置每天0点进行日志的拆分,所以folder和rq均设置采用昨天的日期进行归档. #!/bin/bash folder=`date -d yesterday +%Y%m` rq=`date -d yesterday +%Y%m%d` # 原始日志路径 logs_path="/var/log/nginx/sitename.com/" # 日志备份路径 logs_backup_path="/var/log/ngi

  • php apache开启跨域模式过程详解

    apaceh 配置: <VirtualHost *:80> ServerAdmin xxx@qq.com DocumentRoot "C:/htdocs/demo" ServerName dev.dd.cn ##ErrorLog "logs/dummy-host.localhost-error.log" ##CustomLog "logs/dummy-host.localhost-access.log" combined <Di

  • Nginx 动态域名解析过程详解

    目录 摘要 基于自定义DNS服务器动态解析 default.conf配置 主要配置点 启动访问 基于K8S的CoreDns动态域名解析 default.conf 主要配置点 摘要 Nginx进行反向代理的时候会进行域名解析,把域名解析为具体IP后缓存在本地,如果域名对应的IP发生了改变,则会导致Nginx代理失效,下面使用Nginx的resolver指令来实现域名动态解析. 基于自定义DNS服务器动态解析 内网DNS服务器我使用的是dnsmasq default.conf配置 server {

  • nginx正向代理与反向代理详解

    正向代理 就是假设有一个内网 内网有两台机器,这两台机器只有 a 可以上网 b 不能上网,但是 a 和 b 通过网络相连接 这时如果 b 想访问外网,就可以通过 a 来正向代理访问外网 正向代理就是在内网中模拟目标服务器,把内网中其它机器的请求 转发给外网中的真正的目标服务器 所以正向代理是接受内网其它机器的请求的 反向代理则是反过来 也是一个内网,有几台机器,只有其中一台与外网连接 但是反向代理接受的不是内网机器的访问请求 反向代理接受的是外网过来的访问请求 然后把请求转发到内网中的其它机器上

随机推荐