现场是这样的。nginx 1.22 上开了 gzip on,首页 HTML 返回 Content-Encoding: gzip,可体积最大的 css 和 js 还是明文传输,PageSpeed 一直提示需要启用压缩。

中间走过弯路,把「静态资源被 CDN 缓存了未压缩的版本,源站改了也没用」当成主因,改完现象没变。

原因不止一个,得分开看。gzip_types 默认只包含 text/html,其他 MIME 要显式列出来;响应头里的 Content-Type 带了 charset,匹配规则需要写对类型;gzip 的 min_length 设得比文件还大,小文件直接被跳过。

先看实际返回的压缩头和类型

curl -sI -H 'Accept-Encoding: gzip' https://demo.lu0.cn/app.css

随后确认 gzip_types 里包含 css 和 js

grep -nE 'gzip_types|gzip_min_length' /etc/nginx/nginx.conf

补齐类型并重载

nginx -t && systemctl reload nginx

剩下的就是清理 CDN 缓存后再验证一次

curl -sI -H 'Accept-Encoding: gzip' https://demo.lu0.cn/app.css | grep -i encoding

排查用的命令都是临时敲的,没有写成脚本,事后才整理。

怎么算真的好了,看的是同一批现象。css 和 js 的响应头里出现 Content-Encoding: gzip,文件体积降到原来的三成左右,PageSpeed 的压缩提示消失。

提醒一点。不要给图片和视频加 gzip,压不动还白烧 CPU;改了源站记得刷新 CDN,否则验证到的还是缓存里的旧响应。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189