MENU

LNMP编译Nginx启用Brotli压缩算法

2019 年 06 月 04 日 • 阅读: 303 • 运维技术阅读设置

Google-brotli-algorithm.jpg

什么是Brotli

Brotli最初发布于2015年,用于网络字体的离线压缩。Google软件工程师在2015年9月发布了包含通用无损数据压缩的Brotli增强版本,特别侧重于HTTP压缩。其中的编码器被部分改写以提高压缩比,编码器和解码器都提高了速度,流式API已被改进,增加更多压缩质量级别。新版本还展现了跨平台的性能改进,以及减少解码所需的内存。

brotli.png

与常见的通用压缩算法不同,Brotli使用一个预定义的120千字节字典。该字典包含超过13000个常用单词、短语和其他子字符串,这些来自一个文本和HTML文档的大型语料库。预定义的算法可以提升较小文件的压缩密度。

使用brotli取代deflate来对文本文件压缩通常可以增加20%的压缩密度,而压缩与解压缩速度则大致不变。

项目地址https://github.com/google/ngx_brotli

浏览器支持情况

  • Mozilla Firefox在Firefox 44中实现Brotli。
  • Google Chrome从Chrome 49开始支持Brotli。
  • Opera从Opera 36开始支持Brotli。
  • Safari从iOS11开始支持Brotli压缩算法。

安装配置

我用的环境是CentOS + LNMP1.6一键脚本,只需要重新编译一遍nginx就好

下载Brotli源码

最新版无需额外安装依赖 bagder/libbrotli,如果LNMP环境已经搭建完成,可以参考下列步骤进行:

cd ~/lnmp1.6-full/src/
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
git submodule update --init

修改编译配置

修改include目录中的upgrade_nginx.sh文件

vi ~/lnmp1.6-full/include/upgrade_nginx.sh

修改下面这段代码:

    if [[ "${Nginx_Ver_Com}" == "0" ||  "${Nginx_Ver_Com}" == "1" ]]; then
        ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_spdy_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module ${Nginx_With_Openssl} ${Nginx_Module_Lua} ${NginxMAOpt} ${Nginx_Modules_Options}
    else
        ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module ${Nginx_With_Openssl} ${Nginx_Module_Lua} ${NginxMAOpt} ${Nginx_Modules_Options} 
    fi

简单的说,就是将 else 之后的 ./configure 配置中增加 --add-module=../ngx_brotli 来启用模块。

修改后的代码为:

    if [[ "${Nginx_Ver_Com}" == "0" ||  "${Nginx_Ver_Com}" == "1" ]]; then
        ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_spdy_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module ${Nginx_With_Openssl} ${Nginx_Module_Lua} ${NginxMAOpt} ${Nginx_Modules_Options}
    else
        ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module ${Nginx_With_Openssl} ${Nginx_Module_Lua} ${NginxMAOpt} ${Nginx_Modules_Options} --add-module=../ngx_brotli
    fi

修改完成后,按ESC键输入:wq 保存并退出。

编译升级

接下来给予upgrade_nginx.sh文件执行权限。

chmod +x upgrade_nginx.sh

升级Nginx

cd ~/lnmp1.6-full
./upgrade.sh nginx

这时候会弹出一个提示,要求输入升级的Nginx版本号。当前我的Nginx版本为1.6.0,觉得没有必要升级版本,直接输入当前的版本号 1.6.0 按回车键确定,接下来就是等待其自动编译安装完成。

编译完成后,检查一下 openssl 版本号对不对

nginx -V

修改Nginx配置文件

找到Nginx的全局配置文件,我的在/usr/local/nginx/conf/nginx.conf
http 段加入一下代码

brotli on;
brotli_comp_level 6;
brotli_min_length 512;
brotli_types text/plain text/javascript text/css text/xml text/x-component application/javascript application/x-javascript application/xml application/json application/xhtml+xml application/rss+xml application/atom+xml application/x-font-ttf application/vnd.ms-fontobject image/svg+xml image/x-icon font/opentype;
brotli_static always;

最后重启/重载nginx使配置生效即可。

/etc/init.d/nginx restart

Brotli全部参数详解:

brotli on;              #启用
brotli_comp_level 6;    #压缩等级,默认6,最高11,太高的压缩水平可能需要更多的CPU
brotli_buffers 16 8k;   #请求缓冲区的数量和大小
brotli_min_length 20;   #指定压缩数据的最小长度,只有大于或等于最小长度才会对其压缩。这里指定20字节
brotli_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml text/html application/json image/svg application/font-woff application/vnd.ms-fontobject application/vnd.apple.mpegurl image/x-icon image/jpeg image/gif image/png image/bmp;   #指定允许进行压缩类型
brotli_static always;   #是否允许查找预处理好的、以.br结尾的压缩文件,可选值为on、off、always
brotli_window 512k;     #窗口值,默认值为512k

打开Chrome开发者模式 Network,刷新网页,看到Content-Encoding: br 响应头表示成功

扫码手机看 请喝咖啡 返回首页
本页链接的二维码
打赏二维码