什么是Brotli
项目地址: https://github.com/google/ngx_brotli
Brotli最初发布于2015年,用于网络字体的离线压缩。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。
Nginx开启两种压缩
一般的Nginx都默认支持Gzip压缩,直接启用即可。于是我在/etc/nginx/common/
目录下新建enable-gzip
文件以备用
# 开启gzip
gzip on;
# 开启gzip_static
# gzip_static 开启后可能会报错,需要安装相应的模块, 具体安装方式可以自行查询
# 只有这个开启,vue文件打包的.gz文件才会有效果,否则不需要开启gzip进行打包
gzip_static on;
gzip_proxied any;
gzip_min_length 1k;
gzip_buffers 4 16k;
#如果nginx中使用了多层代理 必须设置这个才可以开启gzip。
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
gzip_disable "MSIE [1-6]\.";
同样的,我们继续在这个目录下新建enable-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 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
为了同时开启这两种压缩算法,我们可以再在该目录下新建一个enable-compress
文件
include common/enable-brotli;
include common/enable-gzip;
最后,我们回到/etc/nginx/nginx.conf
中,引用nginx的brotli模块(如果没有需要安装)并在http块内引用我们上面的enable-compress
user http http;
worker_processes 1;
# 导入brotli模块
# Debian或Ubuntu上需安装libnginx-mod-http-brotli-static 和 libnginx-mod-http-brotli-filter
# Debian或Ubuntu安装完上述两个包后就不需要下面的load_module了
# 如果是Arch,需要安装nginx-mod-brotli,并添加以下两行
load_module "/usr/lib/nginx/modules/ngx_http_brotli_filter_module.so";
load_module "/usr/lib/nginx/modules/ngx_http_brotli_static_module.so";
error_log /var/log/nginx/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
include site-enable/*.conf;
default_type application/octet-stream;
upstream php-handler {
server unix:/dev/shm/php-fpm.sock;
}
sendfile on;
types_hash_max_size 2048;
types_hash_bucket_size 128;
keepalive_timeout 65;
# 导入我们的enable-compress文件
include common/enable-compress;
include /etc/nginx/sites-enabled/*;
}
大功告成