gzip 压缩
约 495 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › Nginx › 高级配置(在新窗口打开) › gzip 压缩
启用 gzip
http {
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml+rss text/javascript image/svg+xml;
gzip_min_length 1000;
gzip_comp_level 6;
gzip_vary on;
gzip_proxied any;
gzip_disable "msie6";
# ...
}参数详解
| 指令 | 默认值 | 说明 |
|---|---|---|
gzip on | off | 启用 gzip 压缩 |
gzip_types | text/html | 哪些 MIME 类型需要压缩 |
gzip_min_length | 20 | 小于此字节不压缩(避免压缩小文件浪费 CPU) |
gzip_comp_level | 1 | 压缩级别 1-9(1 最快,9 最小) |
gzip_vary | off | 添加 Vary: Accept-Encoding 响应头 |
gzip_proxied | off | 对代理请求的压缩策略 |
gzip_disable | — | 禁用 gzip 的 User-Agent 正则 |
压缩级别选择
# 推荐:级别 4~6(平衡 CPU 和压缩率)
gzip_comp_level 5;
# 高压缩(省带宽,费 CPU)
gzip_comp_level 9;
# 快速(省 CPU,带宽消耗大)
gzip_comp_level 2;实际效果对比(CSS 文件):
| 级别 | 压缩率 | CPU 耗时 |
|---|---|---|
| 1 | ~70% | 低 |
| 5 | ~75% | 中 |
| 9 | ~76% | 高 |
级别 5 以上压缩率提升极其有限,推荐用 5~6。
gzip_static 预压缩
提前用 gzip 压缩好文件,Nginx 直接返回 .gz 文件,避免实时压缩:
# 构建时预压缩(如 webpack 插件或手动)
gzip -k dist/app.js # 生成 dist/app.js.gzhttp {
gzip_static on; # 启用预压缩文件检查
gzip on;
gzip_types text/plain text/css application/javascript;
# 如果 dist/app.js.gz 存在,直接返回它
# 比实时压缩更快,且无需消耗 CPU
}确认 gzip 生效
# 查看响应头
curl -H "Accept-Encoding: gzip" -I https://example.com/app.js
# Content-Encoding: gzip
# Vary: Accept-Encoding
# 实际下载并解压测试
curl -H "Accept-Encoding: gzip" https://example.com/app.js | gunzip - | head不返回 Content-Encoding: gzip 的原因:
- 文件小于
gzip_min_length - MIME 类型不在
gzip_types中 - 客户端不支持 gzip(不发送
Accept-Encoding: gzip)
小结
gzip on是基础,gzip_types需要显式声明哪些类型需要压缩。gzip_comp_level 5是推荐值,平衡 CPU 与带宽。gzip_min_length 1000避免压缩小文件。gzip_static on利用预压缩文件,零 CPU 消耗。gzip_vary on让缓存服务器正确处理不同编码的缓存。
上一节:rewrite 与 return 下一节:CORS 跨域
