如何利用 gzip_types 准确设置压缩 MIME 类型,防止对已压缩文件重复压缩?
- 内容介绍
- 相关推荐
本文共计785个文字,预计阅读时间需要4分钟。
为了让Nginx的Gzip压缩功能真正高效、不拖累性能,关键不在于多压,而在于压对。gzip_types的核心作用是精确匹配响应头中的Content-Type,仅压缩可获益的文本类资源,跳过已压缩的二进制格式。
误配会导致CPU白耗、带宽未增反减,甚至影响缓存行性能。
必须显式列出所有目标类型,不能依赖通配符
Nginx 不支持 text/* 或 application/* 这类模糊写法。哪怕只漏掉 text/html,整个页面 HTML 就会失去压缩——因为 gzip_types 是覆盖式配置,默认的 text/html 会被完全取代。
- 推荐基础组合:
text/html text/plain text/css text/javascript application/javascript application/json application/xml text/xml application/xml+rss image/svg+xml - 字体文件如
.woff2可加application/font-woff2(部分浏览器支持压缩) - 避免写
application/octet-stream或泛型类型,极易误伤图片、视频等二进制资源
确认 MIME 类型与文件扩展名是否真实映射
gzip_types 不看后缀名,只认响应头里的 Content-Type。如果某个自定义后缀(比如 .ts、.md)没在 mime.types 中声明对应类型,Nginx 就会给它返回 application/octet-stream 或默认类型,即使你写了 gzip_types text/typescript 也无效。
- 先检查
/etc/nginx/mime.types(macOS 通常在/usr/local/etc/nginx/mime.types) - 补充缺失映射,例如:
types { text/markdown md; application/typescript ts; } - 再在
gzip_types中加入text/markdown application/typescript
明确排除已压缩资源,防止二次压缩
JPEG、PNG、GIF、MP4、WEBP、AVIF、ZIP 等格式本身已是高压缩比编码,Gzip 对它们几乎无压缩效果,反而增加 CPU 开销和延迟。Nginx 默认不压缩这些,但如果你用 gzip_types *(非法)或错误引入了 image/*,就可能触发无效压缩。
- 绝对不要添加:
image/jpeg image/png video/mp4 application/zip - 注意 SVG 是例外:它是纯文本 XML 格式,
image/svg+xml可且应压缩 - 若后端已返回
Content-Encoding: gzip(如某些 CDN 或代理),Nginx 默认透传,不会重复压缩
验证是否生效,别只信配置
改完配置后,务必用实际请求验证,而不是仅靠 nginx -t 通过。
- 用
curl -H "Accept-Encoding: gzip" -I https://yoursite.com/style.css查看响应头是否有Content-Encoding: gzip - 对比压缩前后大小:
curl -H "Accept-Encoding: gzip" -s https://yoursite.com/app.js | wc -cvscurl -H "Accept-Encoding: identity" -s https://yoursite.com/app.js | wc -c - 检查
Vary: Accept-Encoding是否存在(尤其对接 CDN 时,缺失会导致缓存错乱)
本文共计785个文字,预计阅读时间需要4分钟。
为了让Nginx的Gzip压缩功能真正高效、不拖累性能,关键不在于多压,而在于压对。gzip_types的核心作用是精确匹配响应头中的Content-Type,仅压缩可获益的文本类资源,跳过已压缩的二进制格式。
误配会导致CPU白耗、带宽未增反减,甚至影响缓存行性能。
必须显式列出所有目标类型,不能依赖通配符
Nginx 不支持 text/* 或 application/* 这类模糊写法。哪怕只漏掉 text/html,整个页面 HTML 就会失去压缩——因为 gzip_types 是覆盖式配置,默认的 text/html 会被完全取代。
- 推荐基础组合:
text/html text/plain text/css text/javascript application/javascript application/json application/xml text/xml application/xml+rss image/svg+xml - 字体文件如
.woff2可加application/font-woff2(部分浏览器支持压缩) - 避免写
application/octet-stream或泛型类型,极易误伤图片、视频等二进制资源
确认 MIME 类型与文件扩展名是否真实映射
gzip_types 不看后缀名,只认响应头里的 Content-Type。如果某个自定义后缀(比如 .ts、.md)没在 mime.types 中声明对应类型,Nginx 就会给它返回 application/octet-stream 或默认类型,即使你写了 gzip_types text/typescript 也无效。
- 先检查
/etc/nginx/mime.types(macOS 通常在/usr/local/etc/nginx/mime.types) - 补充缺失映射,例如:
types { text/markdown md; application/typescript ts; } - 再在
gzip_types中加入text/markdown application/typescript
明确排除已压缩资源,防止二次压缩
JPEG、PNG、GIF、MP4、WEBP、AVIF、ZIP 等格式本身已是高压缩比编码,Gzip 对它们几乎无压缩效果,反而增加 CPU 开销和延迟。Nginx 默认不压缩这些,但如果你用 gzip_types *(非法)或错误引入了 image/*,就可能触发无效压缩。
- 绝对不要添加:
image/jpeg image/png video/mp4 application/zip - 注意 SVG 是例外:它是纯文本 XML 格式,
image/svg+xml可且应压缩 - 若后端已返回
Content-Encoding: gzip(如某些 CDN 或代理),Nginx 默认透传,不会重复压缩
验证是否生效,别只信配置
改完配置后,务必用实际请求验证,而不是仅靠 nginx -t 通过。
- 用
curl -H "Accept-Encoding: gzip" -I https://yoursite.com/style.css查看响应头是否有Content-Encoding: gzip - 对比压缩前后大小:
curl -H "Accept-Encoding: gzip" -s https://yoursite.com/app.js | wc -cvscurl -H "Accept-Encoding: identity" -s https://yoursite.com/app.js | wc -c - 检查
Vary: Accept-Encoding是否存在(尤其对接 CDN 时,缺失会导致缓存错乱)

