0%

Gzip压缩

Nginx Gzip 压缩配置详解:提升传输效率的实战指南

Gzip 压缩是优化 Web 性能的关键手段,通过对响应数据(如 HTML、CSS、JS)进行实时压缩,减少网络传输量,提升页面加载时间。Nginx 内置 Gzip 模块,可通过简单配置实现高效压缩。本文详细讲解 Gzip 的核心参数、配置方法及最佳实践,帮助最大化压缩效率。

Gzip 压缩原理与优势

  • 原理:Nginx 在向客户端发送响应前,对符合条件的文件(如文本类资源)进行 Gzip 压缩,客户端接收后自动解压(现代浏览器均支持);
  • 优势
    • 减少传输数据量(通常压缩率可达 50%-70%);
    • 降低带宽消耗,提升页面加载速度;
    • 尤其适合文本类资源(HTML、CSS、JS),对图片(已压缩格式如 JPG/PNG)效果有限。

核心配置参数详解

Nginx 的 Gzip 配置主要通过gzip及相关指令实现,常用参数如下:

指令 作用 推荐值
gzip 开启 / 关闭 Gzip 压缩 on(开启)
gzip_comp_level 压缩级别(1-9,级别越高压缩率越高但 CPU 消耗越大) 2-4(平衡压缩率与性能)
gzip_min_length 最小压缩文件大小(小于该值的文件不压缩,避免反增体积) 1k(1024 字节)
gzip_buffers 压缩缓存空间(个数 × 大小) 16 8k(16 个缓存块,每个 8k)
gzip_types 指定需要压缩的 MIME 类型(文件类型) text/plain text/css application/javascript ...
gzip_vary 向响应头添加Vary: Accept-Encoding,告知代理服务器缓存压缩 / 非压缩版本 on
gzip_proxied 对代理后端返回的数据是否压缩(如反向代理场景) any(无条件压缩)
gzip_static 优先使用预压缩的.gz文件(如index.html.gz),减少实时压缩开销 on

基础配置示例

以下是通用的 Gzip 配置,适用于大多数 Web 服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
http {
# 开启Gzip压缩
gzip on;

# 压缩级别(2-4为宜,平衡性能与压缩率)
gzip_comp_level 3;

# 最小压缩文件大小(小于1k的文件不压缩)
gzip_min_length 1024;

# 压缩缓存(16个8k块,共128k)
gzip_buffers 16 8k;

# 支持的HTTP版本(默认1.1,兼容主流浏览器)
gzip_http_version 1.1;

# 需要压缩的文件类型(文本类为主)
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/x-javascript
application/xml
application/json
text/json
image/svg+xml;

# 告知代理服务器缓存压缩/非压缩版本
gzip_vary on;

# 对代理后端的响应也进行压缩
gzip_proxied any;

# 开启预压缩文件支持(优先使用已压缩的.gz文件)
gzip_static on;

# 其他配置...
server {
listen 80;
server_name example.com;
root /var/www/html;
}
}

针对性优化配置

1. 静态资源压缩(HTML/CSS/JS)

文本类资源压缩收益最高,可单独配置强化:

1
2
3
4
5
6
location ~* \.(html|css|js|json|xml|svg)$ {
gzip on;
gzip_comp_level 4; # 适当提高压缩级别(文本压缩成本低)
gzip_min_length 512; # smaller文本也压缩
gzip_types text/html text/css application/javascript application/json image/svg+xml;
}

2. 图片资源:谨慎压缩

JPG、PNG、WebP 等图片本身已压缩,Gzip 压缩效果有限(甚至可能增大体积),建议排除或仅压缩未优化的图片:

1
2
3
4
5
6
7
8
9
10
11
# 对未压缩的图片格式(如BMP)进行压缩,跳过已压缩格式
location ~* \.(bmp)$ {
gzip on;
gzip_comp_level 2; # 低级别压缩(避免浪费CPU)
gzip_types image/bmp;
}

# 对已压缩图片不启用Gzip
location ~* \.(jpg|jpeg|png|gif|webp)$ {
gzip off;
}

3. 预压缩文件(gzip_static

对于访问频繁的静态资源(如 JS 库、CSS 框架),可预先生成.gz压缩文件,减少 Nginx 实时压缩的 CPU 消耗:

  • 步骤 1:手动压缩文件(如index.jsindex.js.gz):

    1
    gzip -k -6 /var/www/html/js/index.js  # -k保留原文件,-6压缩级别
  • 步骤 2:配置gzip_static自动使用预压缩文件:

    1
    2
    3
    4
    5
    location ~* \.(js|css)$ {
    gzip_static on; # 优先使用.gz文件
    gzip_proxied expired no-cache no-store private auth;
    expires 1d; # 配合客户端缓存
    }
    • 效果:客户端请求index.js时,Nginx 直接返回index.js.gz(若存在且客户端支持 Gzip)。

注意事项与最佳实践

  1. 避免过度压缩

    • 压缩级别gzip_comp_level建议设为 2-4(级别越高,CPU 消耗呈指数增长,而压缩率提升有限);
    • 小文件(如 < 1k)不压缩(压缩后可能比原文件大,且浪费 CPU)。
  2. 动态内容压缩

    • 对动态生成的内容(如 PHP/JSP 输出),确保gzip_proxied any开启,避免后端未压缩时 Nginx 也不处理。
  3. 测试压缩效果

    • 使用curl验证响应头是否包含Content-Encoding: gzip:

      1
      curl -I -H "Accept-Encoding: gzip" http://example.com/index.css
    • 若返回Content-Encoding: gzip,说明压缩生效。

  4. 兼容性处理

    • 老版本浏览器(如 IE6)对 Gzip 支持不佳,可通过if条件排除:

      1
      2
      3
      if ($http_user_agent ~* "MSIE [1-6]\.") {
      gzip off;
      }

常见问题排查

  • 压缩未生效
    • 检查gzip on是否开启;
    • 确认文件类型在gzip_types中;
    • 检查文件大小是否超过gzip_min_length
  • 压缩后体积变大
    • 小文件(<1k)关闭压缩;
    • 已压缩格式(如 JPG、PNG)关闭压缩。
  • CPU 占用过高
    • 降低gzip_comp_level
    • 启用gzip_static,使用预压缩文件

欢迎关注我的其它发布渠道