2.4.1 对传输内容进行压缩
对传输内容压缩,是提升 HTTP 服务可用性的必要手段。例如使用 Gzip 压缩,一个 100KB 的文件压缩之后通常会变成 30KB,体积降低 70%,不仅提升网络传输效率,还能降低带宽成本。
1. HTTP 压缩的原理
所有的现代浏览器、客户端及 HTTP 服务器软件都支持压缩技术,唯一需要协商的是客户端与服务端所采用的压缩算法。
至于采用何种压缩算法,HTTP 客户端和服务器之间使用主动协商机制确认(如图 2-8 所示):
- HTTP 客户端发送 Accept-Encoding 首部(包含它所支持的压缩算法,以及各自的优先级),
- 服务器则从中选择它支持一种算法,使用该算法对响应的消息主体进行压缩,并且发送 Content-Encoding 头部信息来告知 HTTP 客户端它选择了哪一种算法。
图 2-8 HTTP 压缩算法协商过程
2. 使用 Brotli 压缩
默认情况,一般使用 Gzip 对内容进行压缩,但 HTTP 类型的场景还有一个具有更高压缩率的算法 Brotli[1]。
什么是 Brotli
Brotli 是 Google 推出的开源无损压缩算法,通过变种的 LZ77 算法、Huffman 编码以及二阶文本建模等方式进行数据压缩。
Brotli 内部有一个预定义的字典,该字典包含超过 13000 个常用单词、短语和其他子字符串,在这种预定义字典下,一个词会作为一个整体被匹配,这种方式可以大幅提升文本型内容的压缩密度。
如图 2-9 所示,各类型的压缩算法,在不同压缩等级下的压缩效果对比。
图 2-9 Brotli、Zopfli、gzip 压缩算法在不同压缩等级下的压缩率对比
从上图的结果中,我们看到因为 Brotli 更侧重于 HTTP 文本型内容的压缩,压缩效果比常使用的 Gzip 高17~30%
。
使用 Brotli 时,服务端和客户端(Chrome、Firefox 和 Opera 等主要浏览器已支持)需要额外安装软件支持,服务端安装 Brotli 后可以和 gzip 一同开启,客户端根据需要选择合适的压缩算法。
如下为 Nginx 中的 Brotli 配置示例。
http {
brotli on; // 开启 brotli 压缩
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; // 压缩类型
}
参见 https://github.com/google/brotli ↩︎
![](/assets/qrcode-v2-Dm-ghQau.png)