Brotli 是一个通用的无损压缩算法,压缩的数据,结合使用一种现代变种LZ77算法,霍夫曼编码和第2次以上下文模型,用压缩比率相当于目前最好的可用的通用压缩的方法
介绍
- 由 Google 开源于 2015 年
- brotli 比 gzip 快 30%,压缩结果大小差不太多,阿里云 CDN 支持 brotli 压缩算法
- Brotli Compressed Data Format is defined in RFC 7932
- 2013-2016 年完成规范,旨在进一步提高压缩比,它在优化网站速度上有大量应用
- Brotli 是相似的速度缩小,但提供了更多的密集的压缩
- 与常见的通用压缩算法不同,Brotli 使用一个预定义的 120 千字节字典
- 该字典包含超过 13000 个常用单词、短语和其他子字符串
- 使用 brotli 取代 deflate 来对文本文件压缩通常可以增加20%的压缩密度,而压缩与解压缩速度则大致不变
- 使用 Brotli 进行流压缩的内容编码类型已被提议使用
br
- Brotli 在 Web 浏览器中广泛用于压缩 Web 应用资源,如字体、javascript、图像等
- 如今超过 95% 的网络浏览器都支持 Brotli 解压
- 许多 Web 应用程序框架都支持 Brotli 编码(例如 NGINX 和 ASP.NET)
- 一些 CDN 使用 Brotli 编码(例如 Aliyun、Azure 和 ImageKit)
安装
# ubuntu
sudo apt-get install -y brotli1g brotli1g-dev
# mac
brew install brotli
# centos/redhad
sudo yum install -y brotli brotli-devel
help
$ brotli --help
Usage: brotli [OPTION]... [FILE]...
Options:
-# compression level (0-9)
-c, --stdout write on standard output
-d, --decompress decompress
-f, --force force output file overwrite
-h, --help display this help and exit
-j, --rm remove source file(s)
-k, --keep keep source file(s) (default)
-n, --no-copy-stat do not copy source file(s) attributes
-o FILE, --output=FILE output file (only if 1 input file)
-q NUM, --quality=NUM compression level (0-11)
-t, --test test compressed file integrity
-v, --verbose verbose mode
-w NUM, --lgwin=NUM set LZ77 window size (0, 10-24)
window size = 2**NUM - 16
0 lets compressor choose the optimal value
-S SUF, --suffix=SUF output file suffix (default:'.br')
-V, --version display version and exit
-Z, --best use best compression level (11) (default)
Simple options could be coalesced, i.e. '-9kf' is equivalent to '-9 -k -f'.
With no FILE, or when FILE is -, read standard input.
All arguments after '--' are treated as files.
Python lib
pip install brotli
pip install --upgrade git+https://github.com/google/brotli
import brotli
import os
input_file = '/etc/hosts'
output_file = 'hosts.br'
def compress_file(_input_file, _output_file):
with open(_input_file, 'rb') as file:
data = file.read()
compressed_data = brotli.compress(data)
with open(_output_file, 'wb') as _output_file:
_output_file.write(compressed_data)
compress_file(input_file, output_file)
nginx
# Compress responses on-the-fly.
load_module modules/ngx_http_brotli_filter_module.so;
# Serve pre-compressed files.
# Both modules could be used separately
load_module modules/ngx_http_brotli_static_module.so;
brotli on;
brotli_comp_level 4;
brotli_types text/plain text/css application/javascript application/json image/svg+xml application/xml+rss;
brotli_static on;
sudo systemctl restart nginx
- 请求的header
Accept-Encoding: br
- 响应的header
Content-Encoding: br
命令行使用
# 压缩
brotli --output=hosts.br /etc/hosts
# 解压
brotli -d hosts.br
扩展
- Brotli-G 对标准 Brotli 比特流格式的修改
- 允许使用 GPU 和多线程 CPU 进行高效的数据并行解压缩,同时仍保持相对较高压缩率