proxy_read_timeout 300s;
proxy_send_timeout 300s;
keepalive_timeout 75s;
nginx -s reload

导出 80MB 的 CSV 下到 90 秒左右连接断开,curl 报 18 transfer closed with outstanding read data remaining。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:上游生成文件要两分多钟,proxy_read_timeout 默认 60 秒,两次读之间超时就断开。keepalive_timeout 管的是客户端空闲连接,不是这个等待。

「长连接提前关闭」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:把 proxy_read_timeout 和 proxy_send_timeout 提到 300s;确认上游 PHP 或 Java 的执行超时也大于这个值;大文件改成先落对象存储再给下载链接 避开长连接;用 curl 限速复现一次 确认不再中断。

确认没问题再收工,同样的导出请求在 150 秒时仍能继续传输 curl 退出码为 0。

作者 9823189