如何配置 Nginx 开启 gzip 压缩减少负载均衡带宽消耗

文章导读
在 Nginx 的 http 块中开启 gzip 压缩,对文本类资源(HTML、CSS、JS、JSON)进行压缩,能有效减少负载均衡场景下的出口带宽消耗,适合高流量网站和带宽成本敏感的场景。
📋 目录
  1. A 命令速用版
  2. B 配置详解与场景
  3. C 怎么验证是否生效
  4. D 常见坑
  5. E 参考来源
A A

在 Nginx 的 http 块中开启 gzip 压缩,对文本类资源(HTML、CSS、JS、JSON)进行压缩,能有效减少负载均衡场景下的出口带宽消耗,适合高流量网站和带宽成本敏感的场景。

先说结论:开启 gzip 压缩是降低带宽消耗的高性价比方案,但需要平衡 CPU 开销,生产环境建议压缩级别设为 4-6。

  • 先定位:确认 Nginx 已编译 gzip 模块,检查当前带宽消耗情况
  • 先做:在 http 块或 server 块配置 gzip 基础参数,避免对小文件和已压缩文件重复压缩
  • 再验证:用浏览器开发者工具、curl 命令或带宽监控工具检查响应头及流量变化

命令速用版

检查 Nginx 是否支持 gzip 模块:

nginx -V 2>&1 | grep gzip

如果看到`--with-http`_gzip_module`--with-http`_gzip_static_module,说明 gzip 功能可用。

重新加载 Nginx 配置:

sudo nginx -t && sudo nginx -s reload

配置详解与场景

第一步:编辑 Nginx 配置文件

找到 Nginx 配置文件(通常位于/etc/nginx/nginx.conf/etc/nginx/conf.d/下的站点配置)。在负载均衡场景下,配置通常位于反向代理服务器的http块或具体的server块中。

注意:http块配置全局生效,server块配置仅对当前站点生效。若需针对特定 location 优化,也可在location块中覆盖。

http {
    # 开启 gzip 压缩
    gzip on;
    
    # 压缩级别 1-9,推荐 4-6(平衡性能)
    gzip_comp_level 6;
    
    # 最小压缩文件大小,小于此值不压缩(避免小文件压缩后反而变大)
    gzip_min_length 1000;
    
    # 需要压缩的 MIME 类型
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
    # 添加 Vary: Accept-Encoding 头,确保代理服务器正确处理缓存
    gzip_vary on;
    
    # 负载均衡场景关键配置:允许对代理请求进行压缩
    gzip_proxied any;
}

第二步:检查配置语法

sudo nginx -t

如果输出syntax is oktest is successful,说明配置正确。

第三步:重新加载配置

sudo nginx -s reload

第四步:可选优化——预压缩静态文件

对于不经常变化的静态文件,可以预先生成.gz 版本,减少运行时 CPU 消耗:

gzip -k -9 static/style.css

然后在 Nginx 中启用:

gzip_static on;

注意:此功能需要 Nginx 编译时包含ngx_http_gzip_static_module模块。

怎么验证是否生效

方法一:浏览器开发者工具

打开浏览器访问你的网站,按 F12 打开开发者工具,进入 Network 标签,刷新页面,查看资源列表中的Content-Encoding列,如果显示gzip,说明压缩已生效。

方法二:curl 命令检查

curl -H "Accept-Encoding: gzip" -I https://your-domain.com/index.html

查看响应头中是否包含:

如何配置 Nginx 开启 gzip 压缩减少负载均衡带宽消耗
Content-Encoding: gzip

方法三:带宽监控工具验证(生产环境推荐)

在负载均衡服务器上安装流量监控工具(如 iftop 或 ntopng),观察开启 gzip 前后的出口带宽变化。

# 安装 iftop (以 Ubuntu 为例)
sudo apt-get install iftop

# 监控网卡流量(替换为实际网卡名,如 eth0)
sudo iftop -i eth0 -n

对比开启 gzip 前后,相同并发下的带宽峰值是否下降。

方法四:灰度发布验证

生产环境建议先在一台节点生效,观察 CPU 负载和带宽监控,确认无异常后再全量推送。

常见坑

1. 压缩级别过高

级别 9 的压缩率比级别 6 收益提升有限,但 CPU 时间可能增加数倍。生产环境不建议使用级别 9,除非 CPU 资源非常充裕且带宽成本极高。

2. 对已压缩文件再次压缩

图片(jpg、png)、视频、zip 等文件本身已压缩,再次 gzip 压缩收益接近 0%,还会浪费 CPU。不要在gzip_types中包含这些类型。

3. 小文件压缩反而亏本

小于 1KB 的文件压缩后可能比原文件还大(压缩头开销),设置gzip_min_length避免这种情况。

4. 缓存失效问题

如果 Nginx 后方有反向代理或 CDN,确保开启gzip_vary on,这样代理服务器会根据Accept-Encoding头缓存不同版本,避免未压缩和压缩版本混淆。

5. 动态内容压缩

对于后端动态生成的内容,在负载均衡场景下必须配置gzip_proxied any;,否则 Nginx 可能默认不对代理响应进行压缩。

6. 浏览器兼容性配置

现代浏览器均支持 gzip,无需再配置禁用 IE6 等旧版本指令(如gzip_disable "MSIE [1-6]\.";),移除可减少配置维护成本。

参考来源

  • Nginx 官方文档 - ngx_http_gzip_module:https://nginx.org/en/docs/http/ngx_http_gzip_module.html