监控每分钟发一次 HEAD /report,流量图里每次都有 2MB 下载量,后端日志也显示 GET 处理。乍看像缓存或者权限的锅,追下去往往不是。
curl -sI https://api.example.com/report
curl -s -o /dev/null -w '%{size_download}\n' -X HEAD https://api.example.com/report
location = /report {
if ($request_method = HEAD) { return 204; }
}
追下去是这么回事:Nginx 把客户端方法原样转给上游,应用框架把 HEAD 当成 GET 处理并生成完整响应。Nginx 收到 body 后又按 HEAD 语义丢弃,链路带宽已经花掉。
碰到「HEAD 请求返回体」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。
监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
具体做法是,用 curl -I 对比 Content-Length 和实际传输字节;在上游或 Nginx 对 HEAD 直接返回 204 不生成正文;报表类接口加缓存 HEAD 只查元数据;抓包确认响应体没有真的传回客户端。
验收就看一点,HEAD 请求 size_download 接近 0 响应仍带正确的 Content-Length。
