关键在于精准配置gzip_types,只压缩text/html、text/plain等文本类MIME类型,排除image/jpeg等已压缩格式;必须显式列出所有类型,避免覆盖默认text/html,且需确保mime.types映射正确并用curl验证响应头。

要让 Nginx 的 gzip 压缩真正起效,关键不是“压得多”,而是“压得准”。gzip_types 的作用就是根据响应头中的 Content-Type,只对适合压缩的文本类资源启用 Gzip,跳过图片、视频等已高压缩格式。它不看文件后缀,只认 MIME 类型;也不支持通配符,必须逐个写明。
必须显式列出所有目标类型,不能漏掉 text/html
gzip_types 是覆盖式配置——一旦设置,就会完全替代 Nginx 默认的 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 - 如需支持现代前端资源,可加:
application/typescript text/markdown application/font-woff2(注意:woff2 压缩需浏览器支持) - 不要写
text/*或application/*—— Nginx 直接忽略,配置无效
确保 MIME 类型与文件扩展名真实映射
即使你在 gzip_types 里写了 text/markdown,如果 .md 文件返回的是 application/octet-stream(说明 Nginx 没识别出类型),那也不会压缩。
- 先检查
/etc/nginx/mime.types(macOS 在/usr/local/etc/nginx/mime.types) - 补充缺失映射,例如:
types { text/markdown md; application/typescript ts; } - 再在 gzip_types 中加入对应项,顺序无关,但类型名称必须完全一致(区分大小写)
明确排除已压缩格式,避免白耗 CPU
JPEG、PNG、GIF、MP4、WEBP、AVIF、ZIP 等本身已是高效编码,Gzip 几乎无法再压缩,反而增加延迟和服务器负载。
- 绝对不要加入:
image/jpeg image/png video/mp4 application/zip - SVG 是例外:它是 XML 文本,
image/svg+xml必须且应当压缩 - 警惕泛型类型如
application/octet-stream,极易误伤二进制资源
验证是否真正生效,别只信配置文件
改完配置后,nginx -t 通过只是语法正确,不代表压缩真在工作。
- 用 curl 实测:
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 默认透传,不会重复压缩

















