精通 Nginx 压缩:Gzip 与 Brotli 在 Web 性能中的应用
优化 Web 性能对于用户留存率和 SEO 排名至关重要。减少延迟和带宽消耗最有效的方法之一是在将 Web 资源发送到客户端之前对其进行压缩。Nginx 作为一个高性能的 Web 服务器,通过两个主要模块提供了强大的内容压缩支持:Gzip 和更现代的 Brotli。
本指南将探讨这些压缩方法在 Nginx 中的工作原理,详细介绍它们的配置,并提供直接比较,以帮助您决定哪种算法最适合您的基础架构和性能目标。精通压缩可以确保更快的加载时间,并为您的用户提供更佳的体验,无论其连接速度如何。
理解 Nginx 中的 Web 压缩
压缩的工作原理是查找数据(如 HTML、CSS 或 JavaScript 文件)中的重复模式,并用更短的引用替换它们。这会减小通过网络传输的文件总大小。Nginx 作为中间人,在将数据发送到浏览器之前动态应用所选的压缩算法。
Nginx 通常需要将 ngx_http_gzip_module (Gzip) 或 ngx_http_brotli_module (Brotli) 编译到二进制文件中。大多数现代预构建的 Nginx 软件包默认包含 Gzip 支持,而 Brotli 通常需要显式安装或编译标志。
先决条件
如果您计划使用 Brotli,请确保您的 Nginx 安装支持 Brotli。您可以通过运行以下命令来检查 Brotli 是否可用:
nginx -V 2>&1 | grep --color=always brotli
如果输出显示 --with-http_brotli_module,则表示您已准备好继续。
1. 配置 Gzip 压缩
Gzip 是内容压缩的成熟且广泛支持的标准。它在压缩率和 CPU 开销之间提供了良好的平衡。
在 Nginx 配置中启用 Gzip
Gzip 设置通常位于 Nginx 配置文件(nginx.conf 或包含的配置文件)的 http、server 或 location 块中。
要启用 Gzip 压缩,请使用以下指令:
http {
# 启用 Gzip 压缩
gzip on;
# 设置要压缩的最小响应大小(字节)
# 仅压缩大于 1000 字节的文件
gzip_min_length 1000;
# 压缩级别(1=最快/最低压缩,9=最慢/最高压缩)
gzip_comp_level 6;
# 指定要压缩的 MIME 类型
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
# 推荐:发送 Vary: Accept-Encoding 头,以便代理缓存压缩和未压缩的版本
gzip_vary on;
# 推荐:添加 gzip 头以进行标识
gzip_proxied any;
}
主要 Gzip 指令详解:
gzip on;: 激活 Gzip 模块。gzip_comp_level: 将此值设置为 4 到 6 之间通常是性能的最佳选择。更高的级别可以节省更多带宽,但会增加服务器的 CPU 使用率。gzip_types: 至关重要的是,您切勿压缩已压缩的格式,如图像(.jpg、.png、.gif)或视频。
2. 配置 Brotli 压缩
Brotli 是 Google 开发的一种较新的压缩算法。它通常比 Gzip 具有更好的压缩率(文件通常小 15-25%),同时 CPU 成本相似或略高,特别是对于预压缩文件或缓存。
在 Nginx 配置中启用 Brotli
Brotli 的配置使用类似的指令,但将 gzip 替换为 brotli。
brotli on;
brotli_comp_level 6; # 通常推荐 4 到 8
brotli_static on; # 启用在可用时提供预压缩的 .br 文件
brotli_types text/plain text/css application/json application/javascript application/x-javascript text/xml;
关于预压缩(brotli_static)的重要提示:
对于每个请求实时进行 Brotli 压缩可能会非常消耗 CPU。一个常见的最佳实践是使用专用的离线工具(如 brotli 命令行实用程序)预压缩资源,并将 .br 版本与原始文件一起存储(例如 style.css 和 style.css.br)。
设置 brotli_static on; 会告诉 Nginx 检查请求的资源是否有预压缩的 .br 文件,并在客户端支持 Brotli 时直接提供该文件,完全绕过实时处理。
3. Gzip vs. Brotli:做出正确选择
在 Gzip 和 Brotli 之间进行选择在很大程度上取决于客户端支持和您的服务器资源。
| 特征 | Gzip | Brotli | 推荐 |
|---|---|---|---|
| 压缩率 | 好 | 优秀(好 15-25%) | Brotli 胜出 |
| CPU 负载(实时) | 低 | 中到高 | Gzip 更轻 |
| 客户端支持 | 几乎通用(所有现代浏览器) | 非常高(大多数现代浏览器) | Gzip 对旧版支持更安全 |
| 预压缩 | 可能,但不常见 | 强烈推荐(brotli_static) |
如果可能,请使用 Brotli 预压缩 |
混合方法:最佳实践
最稳健的现代配置使用混合设置,为现代客户端优先使用 Brotli,同时提供 Gzip 作为可靠的回退。
- 优先 Brotli: 先配置 Brotli,通常使用
brotli_static on;以提高速度。 - 回退到 Gzip: 确保 Gzip 已启用并配置为处理不支持 Brotli 的客户端。
Nginx 会根据客户端发送的 Accept-Encoding 头自动提供最佳可用选项。
混合配置示例
如果您的 Nginx 版本同时支持这两个模块,您可以同时启用它们。Nginx 会根据客户端的请求头来优先确定由哪个模块提供内容。
http {
# --- Brotli 配置(优先级更高/压缩效果更好)---
brotli on;
brotli_comp_level 6;
brotli_static on; # Brotli 性能的关键
brotli_types text/plain application/javascript application/json;
# --- Gzip 配置(回退)---
gzip on;
gzip_comp_level 5;
gzip_vary on;
gzip_proxied any;
gzip_types text/css application/xml;
# 注意:确保 MIME 类型列表不完全重叠,以避免意外行为,
# 尽管 Nginx 通常会智能地处理此问题。
}
性能调优技巧
无论您选择哪种算法,请遵循以下最佳实践以获得最大效果:
1. 验证客户端支持
始终使用 Vary: Accept-Encoding 头确认客户端请求了压缩。如果缺少此头,代理可能会错误地缓存文件的错误版本。gzip_vary on; 会处理 Gzip 的情况。
2. 避免过度压缩
除非您的服务器严重未充分利用,否则切勿将 gzip_comp_level 或 brotli_comp_level 设置得过高(例如 9 或 11)。文件大小缩减的边际收益很少能证明计算所需的额外 CPU 周期是合理的。
3. 缓存预压缩文件
对于 Brotli,使用 brotli_static on; 并预压缩您的静态资源是最大的性能提升。这会将 CPU 负载从请求时间转移到部署时间。
4. 测试您的配置
修改 Nginx 配置后,在重新加载之前务必测试语法:
sudo nginx -t
如果成功,请重新加载 Nginx 以应用更改:
sudo systemctl reload nginx
使用在线工具(如 GTmetrix 或 WebPageTest)确认响应确实带有 Content-Encoding: gzip 或 Content-Encoding: br 头。
结论
Nginx 提供了复杂的工具来减小 Web 传输的数据量。虽然 Gzip 仍然是普遍安全的选择,但Brotli 提供了卓越的压缩效率,使其成为首选的现代标准,特别是当利用 brotli_static 处理预压缩资源时。通过实施混合方法并适当调整压缩级别,您可以显著提高应用程序的响应时间,并提供世界一流的性能体验。