答案是nginx代理缓冲区过小导致响应静默截断;需通过error.log查upstream sent too big header定位header问题,用curl直连对比、$upstream_http_content_length与$body_bytes_sent差值量化截断,tcpdump抓包确认是否卡在4096等缓冲边界。

遇到页面白屏、JSON 缺字段、CSV 少行、HTML 渲染中断或浏览器弹出下载框,却无 5xx 错误、日志也看似正常?很可能是 Nginx 代理缓冲区过小,导致响应被静默截断——既不报错,也不重试,只悄悄发一半数据给客户端。
看错误日志,快速区分头还是体被截
打开 /var/log/nginx/error.log,搜索关键词:
-
upstream sent too big header → 响应头(Header)超限,问题在
proxy_buffer_size - 没有上述报错,但页面异常 → 很可能响应体(Body)被截,重点查
proxy_buffers和磁盘缓冲
用 curl 对比,实测是否少字节
执行两步对比:
- 通过 Nginx 访问:
curl -s http://your-domain/api/data | wc -c - 绕过 Nginx 直连后端(如
curl -s http://127.0.0.1:8080/api/data | wc -c) - 若前者明显偏小(比如差几 KB 或几百 KB),且无错误日志 → 基本确认是 body 截断
加日志字段,量化截断程度
在 log_format 中加入关键变量:
log_format main '$remote_addr - $request "$status" $body_bytes_sent '
'$upstream_http_content_length';
观察日志中 $upstream_http_content_length(后端声称的响应长度)与 $body_bytes_sent(实际发出字节数)的差值。差多少,就截了多少。
抓包验证,确认是否卡在缓冲边界
本地回环抓包最直接:
-
tcpdump -i lo port 80 -w capture.pcap(触发一次异常请求) - 用 Wireshark 打开,过滤 HTTP 流,查看 Nginx 发给客户端的 TCP payload 长度
- 若反复停在 4096、8192、32768 等整数边界 → 实锤是缓冲区硬限制导致的截断











