配置文件里写了 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,优先在边缘开启压缩,源站可以关掉,减少重复计算。两边都开时,确认不会出现压缩两次导致的体积异常。