使用Brotli 压缩替换Gzip

背景

一直以来,Gzip都是最常用的压缩算法之一,被广泛应用于网络通信和网页传输中。然而,随着技术的发展和对更高压缩比和更快解压速度的需求不断增长,Brotli逐渐成为Gzip的替代者。

Brotli是由Google开发的开源压缩算法,它于2015年首次亮相,并在Web领域迅速获得了关注。与Gzip相比,Brotli具有更高的压缩比和更快的解压速度,这使得它成为许多网站和应用程序的首选压缩算法。

环境说明

服务器nginx版本 1.20.1 下载nginx版本 1.25.2

下载 Brotli

github链接 github.com/google/ngx_...

服务器需要安装cmake

bash 复制代码
git clone --recurse-submodules https://github.com/google/ngx_brotli
cd ngx_brotli/deps/brotli
mkdir out && cd out
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_C_FLAGS="-Ofast -m64 -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections" -DCMAKE_CXX_FLAGS="-Ofast -m64 -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections" -DCMAKE_INSTALL_PREFIX=./installed ..
cmake --build . --config Release --target brotlienc
cd ../../../..

下载解压Nginx

下载

bash 复制代码
cd /usr/src
wget http://nginx.org/download/nginx-1.25.2.tar.gz

解压

bash 复制代码
tar -xvf nginx-1.25.2.tar.gz

这样在usr/src会生成一个nginx-1.25.2的目录

静态编译

shell 复制代码
$ cd nginx-1.25.2
$ export CFLAGS="-m64 -march=native -mtune=native -Ofast -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections"
$ export LDFLAGS="-m64 -Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections"
$ ./configure --add-module=/usr/src/ngx_brotli
$ make && make install

注意,起初安装跟服务器同版本1.20.1 的nginx ,这里最后一步报了错,大概原因就是 nginx的版本不统一问题, ngx_brotli只能兼容最新nginx版本,所以换成了当前最新版本1.25.2

目前一切正常

执行到下一步

动态加载

shell 复制代码
$ cd nginx-1.x.x
$ ./configure --with-compat --add-dynamic-module=/usr/to/ngx_brotli
$ make modules

查看编译好的新模块,会有两个新的.so文件

shell 复制代码
ls objs/*.so

将其复制到 /usr/src/lib64/nginx/modules 文件夹下

注册Brotli模块

在nginx.conf中会发现

shell 复制代码
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

nginx是从这个文件夹下面加载动态模块。所以去这个文件夹下面新建一个.conf,内容如下

shell 复制代码
load_module "/usr/src/lib64/nginx/modules/ngx_http_brotli_filter_module.so";
load_module "/usr/src/lib64/nginx/modules/ngx_http_brotli_static_module.so";

开启Brotli

在nginx.conf中

shell 复制代码
# brotli
http {
	brotli on; 
	brotli_comp_level 6; 
	brotli_buffers 16 8k; 
	brotli_min_length 20;
	brotli_static on; # 开启加载.br文件
}

最后nginx 重启即可

重启可能会遇到小插曲,这源于我们服务器的nginx版本和ngx_brotli 这个包的差异 解决办法之一是根据issue中的办法修改源码,参考 github, 但在修改完两个小时后,官方合并了这个issue的mr,有点意思。

至此完成,看看效果,Content-Encoding 变成了br,大小也随之变小

相关推荐
程序员爱技术1 小时前
Vue 2 + JavaScript + vue-count-to 集成案例
前端·javascript·vue.js
并不会2 小时前
常见 CSS 选择器用法
前端·css·学习·html·前端开发·css选择器
衣乌安、2 小时前
【CSS】居中样式
前端·css·css3
兔老大的胡萝卜2 小时前
ppk谈JavaScript,悟透JavaScript,精通CSS高级Web,JavaScript DOM编程艺术,高性能JavaScript pdf
前端·javascript
低代码布道师2 小时前
CSS的三个重点
前端·css
耶啵奶膘3 小时前
uniapp-是否删除
linux·前端·uni-app
王哈哈^_^5 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
cs_dn_Jie5 小时前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
开心工作室_kaic6 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js
有梦想的刺儿6 小时前
webWorker基本用法
前端·javascript·vue.js