gzip_types必须显式列出需压缩的mime类型(如text/html、application/json等),不支持通配符;漏掉text/html会导致html失压,且仅匹配content-type响应头,不看文件后缀,须确保mime.types中已正确定义扩展名映射。

关键不是“压哪些文件”,而是“压哪些响应类型”——gzip_types 只认 Content-Type 响应头,不看文件后缀。配置对了,HTML、CSS、JS 就能压缩;配错了,哪怕写了 .js 文件名,只要返回的是 application/octet-stream,照样不压。
必须显式写全关键类型,不能漏 text/html
gzip_types 是覆盖式配置:一旦启用,就会完全替代 Nginx 默认的仅压缩 text/html 的行为。漏掉 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 类型与文件真实匹配
你写了 text/markdown,但 .md 文件返回的是 application/octet-stream?那它就不会被压缩。原因在 mime.types 没映射。
- 检查 /etc/nginx/mime.types(macOS 在 /usr/local/etc/nginx/mime.types)
- 补充缺失映射,例如:
types { text/markdown md; application/typescript ts; } - 再在 gzip_types 中加入对应项,名称必须完全一致(区分大小写)
坚决排除已压缩格式,避免白耗 CPU
JPEG、PNG、MP4、ZIP、WOFF2 等本身已是高压缩编码,Gzip 对它们几乎无效,甚至可能增大体积。
- 不要加:image/jpeg image/png video/mp4 application/zip font/woff2
- SVG 是例外:image/svg+xml 是纯文本 XML,必须且应当压缩
- 警惕 application/octet-stream —— 它常代表未识别的二进制资源,误加进去会连带压缩图片、PDF 等
验证是否真生效,别只信配置文件
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 默认透传,不会重复压缩











