问题出现得很突然,日志倒是留得挺全。站点开了 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 的请求单独验。这类问题最好一次改到位,反复小改反而容易把原因搅混。
