记录一下那天晚上的排查过程。日志里同一篇文章经常出现成对的请求,一条没有 Cookie 一条带着会话 Cookie,间隔不到一秒。抓取量统计因此翻了一倍,缓存命中率却只有三成,源站的 PHP 进程被打得很满。

刚开始盯着「统计脚本在首屏写入 Cookie 触发一次额外的页面请求」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。页面在服务端无条件下发会话 Cookie 蜘蛛每次都被分配新会话。还有一种是缓存键包含 Cookie 有 Cookie 的请求全部回源。

另外,CDN 对带 Set-Cookie 的响应默认不缓存。

先确认蜘蛛请求是否带回了 Cookie

grep 'Googlebot' access.log | awk -F'"' '{print $6}' | head

静态页面不再下发会话 Cookie

location / { add_header Set-Cookie ''; }

接着把缓存键里的 Cookie 去掉

proxy_cache_key $scheme$host$request_uri;

复测同一地址的请求次数

grep -c 'GET /post/123' access.log

改完先别撤,确认这几项。去掉无谓的 Set-Cookie 后,同一篇文章的重复请求消失,缓存命中率从三成升到八成,抓取量统计也回到真实水平。

提醒一点。搜索引擎请求本来就不该被塞会话,任何无条件下发 Cookie 的逻辑都会让缓存失效并放大抓取次数。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189