Nginx需编译支持http_gzip_module模块才能启用基础gzip压缩,执行nginx -V | grep with-http_gzip_module有输出才有效;gzip_static属另一模块,不替代基础压缩;gzip_types必须显式包含text/html等类型,否则HTML等不会被压缩。

确认 Nginx 已编译支持 http_gzip_module
没这个模块,配了也白配。执行 nginx -V 2>&1 | grep -o with-http_gzip_module,有输出才说明支持。如果没出现,说明当前 Nginx 是精简编译或旧版本,需重新编译并带上 --with-http_gzip_module 参数。注意:gzip_static 是另一个模块(http_gzip_static_module),它只影响预压缩文件的查找逻辑,不是开启基础 gzip 的前提。
gzip_types 必须显式包含 text/html
Nginx 默认的 gzip_types 只含 text/plain,HTML 文件根本不会被压缩——这是最常踩的坑。哪怕你写了 gzip on,只要没加 text/html,浏览器拿到的仍是原始大小的 HTML。
- 推荐写法:
gzip_types text/html text/plain text/css application/javascript application/json text/xml application/xml application/xml+rss; - 别偷懒用
gzip_types *;,Nginx 不认通配符,会直接报配置错误 - 如果站点用到了 SVG 图标或 Web 字体,可追加
image/svg+xml font/ttf font/otf
压缩级别和最小长度要合理设值
gzip_comp_level 9 看着很美,但对 HTML/CSS/JS 这类文本资源,6 级已足够(压缩率约 70%,CPU 开销可控);9 级会让单次响应多耗几毫秒 CPU,高并发下容易拖慢整体吞吐。
-
gzip_min_length 1024是底线:小于 1KB 的响应不压,避免小文件越压越大(比如空 JSON 或极短提示) - 别设成
1k或1K,Nginx 只认数字,单位必须是纯数字(如1024) -
gzip_buffers 16 8k可缓解大文件压缩时的内存压力,尤其当页面含大段内联 JS 时
验证是否真生效,别信配置文件里写了就算
改完配置 reload 后,必须实测响应头。打开浏览器开发者工具 → Network → 刷新首页 → 找到 index.html 请求 → 看 Response Headers:
- 必须同时存在
Content-Encoding: gzip和Vary: Accept-Encoding - 对比
Content-Length和本地原始 HTML 文件大小(可用ls -l index.html查),差值应在 60%~80% 区间 - 用命令快速复现:
curl -I -H "Accept-Encoding: gzip" https://yoursite.com/index.html 2>/dev/null | grep -i -E "content-encoding|vary"
常见假成功:location 块里覆盖了上级 gzip on、HTTPS 站点漏了 gzip_http_version 1.1(虽现代浏览器基本兼容,但老设备可能拒收)、CDN 缓存了未压缩版本导致首屏不生效。











