精通 Nginx 压缩:Gzip 对比 Brotli,助力 Web 性能提升

通过比较 Gzip 和 Brotli 算法,精通 Nginx 内容压缩。学习启用这两种算法的实用配置指令,了解性能权衡,并探索利用静态 Brotli 文件来大幅减少带宽使用、加速 Web 服务器内容交付等最佳实践。

56 浏览量

精通 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 或包含的配置文件)的 httpserverlocation 块中。

要启用 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.cssstyle.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 作为可靠的回退。

  1. 优先 Brotli: 先配置 Brotli,通常使用 brotli_static on; 以提高速度。
  2. 回退到 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_levelbrotli_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: gzipContent-Encoding: br 头。

结论

Nginx 提供了复杂的工具来减小 Web 传输的数据量。虽然 Gzip 仍然是普遍安全的选择,但Brotli 提供了卓越的压缩效率,使其成为首选的现代标准,特别是当利用 brotli_static 处理预压缩资源时。通过实施混合方法并适当调整压缩级别,您可以显著提高应用程序的响应时间,并提供世界一流的性能体验。