配置文件里写了 gzip on,页面加载速度却没什么变化,响应头里也看不到 Content-Encoding。开关开了,但没覆盖到具体文件类型。

先看响应头

curl -H "Accept-Encoding: gzip" -I \
  https://你的域名/static/app.css | grep -i encoding

不加这个请求头,服务器不会压缩,直接 curl 看不出效果。返回里有 gzip 才说明生效。

完整性配置

gzip on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_vary on;
gzip_types text/plain text/css application/json
  application/javascript text/xml image/svg+xml;

gzip_types 默认只包含 text/html,CSS 和 JS 不加进去就不会压缩,这是最常见的漏配。文件小于 min_length 不压缩,避免得不偿失。

还有两种伪失效

一是上游已经压缩过,Nginx 不再二次压缩,这时要看后端或 CDN 的配置;二是 CDN 缓存了未压缩版本,清一次缓存再验证。

图片和视频不要加进 gzip_types,本身已经是压缩格式,再压只会浪费 CPU。检查时用浏览器开发者工具看响应体大小和传输大小两个数值,差值明显才说明生效。

压缩级别别拉满

级别 9 比级别 5 只多省几个百分点,CPU 开销却翻倍,高并发下反而拖慢响应。级别 4 到 6 是常见折中值,改完压测一次再定。

如果站点前面还有一层 CDN,优先在边缘开启压缩,源站可以关掉,减少重复计算。两边都开时,确认不会出现压缩两次导致的体积异常。

作者 9823189