问题出现得很突然,日志倒是留得挺全。站点开了 gzip_static,nginx 1.25 升级后日志里百度请求的 body_bytes_sent 三成是 0,状态码却写着 200。百度抓到的正文为空,索引里三百多篇新文全成了无正文页。

刚开始盯着「蜘蛛请求头带 Accept-Encoding: gzip,正好走了坏的那条分支」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。gzip_static 与 gzip 同时开启,压缩后的文件被二次处理成空体。还有一种是日志格式用了 $body_bytes_sent,压缩后字节数为 0 看不出异常。

不容易想到的是,缓存层把压缩后的长度按未压缩值声明 蜘蛛读到一半就断开。

带压缩头请求一次看实际字节数

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

然后关掉重复的压缩层只留一层

gzip on; gzip_static off;

接着把压缩前后的字节数都记进日志

log_format main '$status $body_bytes_sent $sent_http_content_encoding';

末了重新加载配置并复测

nginx -t && nginx -s reload

怎么算真的好了,看的是同一批现象。关掉 gzip_static 后带压缩头请求的字节数恢复到 18KB 左右,日志里 0 字节的记录消失,两周内空正文页陆续被重新抓取。

提醒一点。压缩层的叠加问题用浏览器很难发现,浏览器会自动重试,蜘蛛不会,所以一定要用带 Accept-Encoding 的请求单独验。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189