现场是这样的。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,否则验证到的还是缓存里的旧响应。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
