必须先确认nginx已编译支持--with-http_gzip_module模块,否则所有gzip配置无效;再在http块中启用gzip on、显式指定gzip_types(含text/css)、设置gzip_min_length和gzip_vary等参数,并用curl验证content-encoding: gzip响应头。

确认 Nginx 已编译支持 gzip 模块
没这个模块,gzip on 再多配置也无效。执行 nginx -V 2>&1 | grep -o with-http_gzip_module,有输出才是真支持。若无结果,说明当前 Nginx 是精简版或旧版本,需重新编译并带上 --with-http_gzip_module 参数。注意:gzip_static 是另一个模块,不能替代基础 gzip 功能。
在 http 块中显式声明 CSS 的 MIME 类型
gzip_types 不包含 text/css,CSS 文件就一定不会被压缩——哪怕你开了 gzip on。它默认只压 text/html,其他类型必须手动加进去。
推荐写法(放在 http { } 块内,不是 server 或 location):
gzip on; gzip_min_length 1024; gzip_comp_level 6; gzip_types text/plain text/css application/javascript application/json application/xml+rss image/svg+xml; gzip_vary on;
-
text/css必须显式列出,漏掉就无效 - 不要把
image/jpeg这类已压缩格式加进去,徒增 CPU 开销 -
gzip_min_length 1024防止小 CSS(比如内联样式提取出的 200 字节文件)越压越大
验证 CSS 是否真的被压缩了
光看配置不顶用,得看响应头。用 curl -H "Accept-Encoding: gzip" -I https://yoursite.com/style.css,返回里必须有 Content-Encoding: gzip,且 Content-Length 明显变小(通常压掉 60%–80%)。
常见失效现象:
- 返回头里没有
Content-Encoding字段 →gzip_types漏了text/css,或配置不在http块 - 有
Content-Encoding: gzip但体积没变小 → 文件本身小于gzip_min_length,被跳过了 - Chrome DevTools Network 面板里 CSS 请求显示“from memory cache” → 缓存了未压缩版本,清缓存或加
Cache-Control: no-cache临时绕过
Webpack/Vite 构建时生成 .gz 文件不是必须的
有人误以为必须让构建工具产出 style.css.gz 才能启用 Gzip,其实不是。Nginx 的 gzip on 是实时压缩:收到请求后,动态读取原始 style.css,当场压缩再发出去。生成 .gz 文件是另一条路(需配合 gzip_static on),但会增加部署复杂度和磁盘占用,还容易因文件未更新导致压缩版本滞后。
除非你明确需要极致首字节时间(TTFB)或想规避 CPU 压缩开销,否则直接用 gzip on 更简单可靠。此时构建产物只需保持原样,Nginx 自动处理。
gzip_vary on:没它,CDN 或反向代理可能把压缩后的响应缓存成“通用版本”,然后错误地返回给不支持 gzip 的客户端。这个开关虽小,却是跨环境生效的关键一环。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











