关键不是压哪些文件,而是压哪些响应类型——gzip_types只依据Content-Type响应头判断,不认文件后缀且不支持通配符;必须显式配置text/html等基础文本类型,漏掉则HTML不压缩;禁用image/jpeg等已压缩二进制类型;确保MIME映射与gzip_types严格一致并验证响应头。

关键不是“压哪些文件”,而是“压哪些响应类型”——gzip_types 只看 Content-Type 响应头,不认文件后缀,也不支持通配符。配错不仅白耗 CPU,还可能增大体积、拖慢首屏。
必须显式写全基础文本类型,尤其不能漏 text/html
nginx 默认只压缩 text/html;一旦你启用 gzip_types,它就**完全覆盖默认行为**。漏掉 text/html,整个 HTML 页面就彻底不压缩,用户打开首页直接变卡。
- 基础必选组合(建议直接复制使用):
text/html text/plain text/css text/javascript application/javascript application/json application/xml text/xml application/xml+rss image/svg+xml - 现代前端可加:
text/markdown application/typescript application/font-woff2(注意:woff2 压缩需浏览器支持,且不是所有场景都推荐) - 绝对不要写
text/*或application/*—— nginx 直接忽略,配置无效
坚决排除已压缩的二进制格式
JPEG、PNG、GIF、MP4、WEBP、AVIF、ZIP、PDF 等本身已是高压缩编码,Gzip 几乎无法再压缩,反而增加延迟和服务器负载。Nginx 默认就不压它们,但误配会触发无效压缩。
- 明确禁止加入:
image/jpeg image/png image/gif video/mp4 application/zip application/pdf - 特别注意:
application/octet-stream是“万能兜底类型”,常代表未识别资源(比如没在mime.types中声明的 .log、.md 文件),误加进去会连带压缩图片、PDF,务必剔除 - SVG 是例外:
image/svg+xml是纯文本 XML,必须且应当压缩
确保 MIME 类型与文件真实匹配,否则写了也白写
你在 gzip_types 里写了 text/markdown,但如果 .md 文件返回的是 application/octet-stream,那它根本不会被压缩——因为 nginx 没识别出类型。
- 先检查
/usr/local/etc/nginx/mime.types(macOS)或/etc/nginx/mime.types(Linux) - 补充缺失映射,例如:
types { text/markdown md; application/typescript ts; } - 再在
gzip_types中加入对应项,名称必须完全一致(区分大小写)
验证是否真生效,别只信配置文件
改完配置后,必须用真实请求验证响应头,而不是只跑 nginx -t:
- 执行:
curl -I -H "Accept-Encoding: gzip" https://yoursite.com/main.js - 确认返回头含:
Content-Encoding: gzip和Vary: Accept-Encoding - 同时检查
Content-Type是否为application/javascript(或其他你配置的类型) - 若后端或 CDN 已返回
Content-Encoding: gzip,nginx 默认透传,不会重复压缩

















