Nginx 反向代理如何启用 gzip 压缩减少带宽占用提升速度

文章导读
在 Nginx 反向代理架构中,启用 gzip 压缩需在配置文件中开启 `gzip` 指令并正确设置 `gzip_proxied` 参数,主要适用于 HTML、CSS、JavaScript 等文本资源。注意若后端服务已输出压缩内容,Nginx 重复压缩会增加 CPU 负载且无法进一步减小体积,需通过响应头判断是否跳过压缩。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 Nginx 反向代理架构中,启用 gzip 压缩需在配置文件中开启 `gzip` 指令并正确设置 `gzip_proxied` 参数,主要适用于 HTML、CSS、JavaScript 等文本资源。注意若后端服务已输出压缩内容,Nginx 重复压缩会增加 CPU 负载且无法进一步减小体积,需通过响应头判断是否跳过压缩。

先说结论:开启 gzip 能有效减少文本资源传输体积,但反向代理场景下必须配置 `gzip_proxied` 否则默认不生效。

  • 先定位:确认传输内容是否为文本类型,排除图片视频等二进制文件
  • 先做:配置 `gzip_proxied any` 或特定状态,避免与后端压缩冲突
  • 再验证:使用 curl 命令检查响应头是否包含 Content-Encoding: gzip

命令速用版

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
gzip_proxied any;
gzip_min_length 1000;

为什么会这样

Nginx gzip 模块通过 HTTP 内容编码机制在传输前压缩数据,浏览器请求头携带 `Accept-Encoding: gzip` 时才会触发。

反向代理模式下,Nginx 默认假设后端服务器已经处理过压缩,因此 `gzip_proxied` 指令默认值为 `off`,若不显式配置,Nginx 不会对代理回来的内容进行压缩。开启后可减少客户端与 Nginx 之间的带宽占用,但会增加 Nginx 服务器的 CPU 计算开销。

分步处理

第一步:编辑 Nginx 配置文件,通常位于 `/etc/nginx/nginx.conf` 或 `/etc/nginx/conf.d/` 下的站点配置。

第二步:在 `http`、`server` 或 `location` 块中加入 gzip 配置,反向代理场景必须包含 `gzip_proxied` 参数。

第三步:执行 `nginx -t` 检查配置语法是否正确,避免语法错误导致服务无法启动。

Nginx 反向代理如何启用 gzip 压缩减少带宽占用提升速度

第四步:执行 `nginx -s reload` 重载配置,使更改生效而不中断现有连接。

第五步:若后端已开启压缩,需在 Nginx 配置中通过 `gzip_proxied no-cache` 等条件避免重复压缩,或直接在后端关闭压缩。

怎么验证是否生效

使用 curl 命令模拟带有压缩请求头的访问,检查响应头中的编码标识。

curl -H "Accept-Encoding: gzip" -I http://your-domain.com/path

观察输出结果中是否包含 `Content-Encoding: gzip` 字段,若存在则说明压缩已生效。也可在浏览器开发者工具的 Network 面板中查看响应头信息,确认 Size 小于 Content-Length 且编码为 gzip。

常见坑

第一,不要对所有文件类型开启 gzip,图片、视频、已压缩的 zip 包等二进制文件压缩率极低且浪费 CPU。

第二,`gzip_min_length` 设置过小会导致小文件压缩得不偿失,建议设置在 1000 字节以上。

第三,反向代理时若后端已返回 `Content-Encoding: gzip`,Nginx 再次压缩可能导致客户端解压失败,需确保只压缩一次。

Nginx 反向代理如何启用 gzip 压缩减少带宽占用提升速度

第四,高并发场景下开启高等级压缩(`gzip_comp_level` 过高)可能导致 CPU 使用率飙升,影响响应速度。

常见问题

后端已经 gzip 了,Nginx 还要开吗?

不需要,检查后端响应头若有 Content-Encoding: gzip,Nginx 应关闭压缩或配置跳过。

开启 gzip 会影响 HTTPS 吗?

不影响,gzip 是应用层压缩,与传输层 TLS 加密互不冲突,兼容所有 HTTPS 场景。

为什么配置了 gzip 但响应头没有 Content-Encoding?

可能是请求头未携带 Accept-Encoding: gzip,或文件大小小于 gzip_min_length 设定值,或 MIME 类型不在 gzip_types 列表中。

参考来源

1. Nginx 官方文档,ngx_http_gzip_module,http://nginx.org/en/docs/http/ngx_http_gzip_module.html

2. Nginx 官方文档,ngx_http_gzip_module 指令说明,http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_proxied