为了省带宽给 HTML 开了 gzip,列表页 HTML 有 200KB,压缩后 28KB。上线后 TTFB 从 320ms 涨到 620ms,蜘蛛抓取开始出现零星超时,源站 CPU 也抬了一截。

一开始怀疑是「没开 gzip_static,静态 HTML 也不预压缩」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。每次请求都现场压缩,gzip 级别开到 9。还有一种是gzip_min_length 设成 1,小文件也走压缩。

不容易想到的是,压缩和 PHP 渲染在同一进程里抢 CPU。

量压缩前后的首字节

curl -s -o /dev/null -w '%{time_starttransfer}\n' -H 'Accept-Encoding: gzip' https://www.example.com/list

降级别并设最小长度

gzip_comp_level 5;
gzip_min_length 1024;

预生成 .gz 并开启静态压缩

gzip_static on;

剩下的就是确认响应头正确

curl -sI -H 'Accept-Encoding: gzip' https://www.example.com/list | grep -i content-encoding

同事提醒我看一下最近一次发布,时间点确实对得上。

命令输出我都留了记录,免得改完记不清原来的值。

改之前先确认了最近有没有人动过配置,避免白查一遍。

改完先别撤,确认这几项。TTFB 回到 350ms 左右,Content-Encoding 仍是 gzip,蜘蛛侧超时消失。

容易忽略的是,压缩比和 CPU 此消彼长,级别 5 已经能拿到九成收益,静态文件预压缩更划算。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189