Watch at Ease看见世界,读懂生活。

科技 · 实用指南

Nginx 报“upstream prematurely closed connection”?加超时前先对齐后端时间线

这条日志表示 Nginx 已连到上游,但对端在预期响应完成前结束了交换。先保存准确阶段和上游地址,把同一请求与进程退出或重启对齐,再只修改一个边界并安全重放。

对齐 NGINX 与上游进程时间线的示意图
原创插画:把代理阶段与后端持有者对齐。 Watch at Ease

这条日志表示 Nginx 已连到上游,但对端在预期响应完成前结束了交换。先保存准确阶段和上游地址,把同一请求与进程退出或重启对齐,再只修改一个边界并安全重放。

“reading response header”表示连接结束时 Nginx 仍在读取上游响应头。 proxy_read_timeout 计算相邻两次读取之间的无数据时间,不是整个响应总时长。

1. 在两侧时钟上冻结同一失败请求

保存完整错误行、请求 ID、方法、URI、状态、上游地址、选中的服务端、连接/响应头/总响应时间,以及失败在读取响应头还是正文。日志轮转前保留匹配的访问日志。

后端保存同一 trace、worker PID、容器或 pod、首尾应用日志、退出码或信号、重启计数、发布事件和 OOM 证据。先校准时钟偏移,不能假设时间戳天然一致。

2. 区分关闭、读取超时与连接阶段

连接拒绝发生在 HTTP 交换前;proxy read timeout 表示相邻读取间超过设定时间没有收到字节;premature close 表示 NGINX 仍期待响应时对端结束连接。增加读取超时无法复活已退出进程。

从 NGINX 的网络命名空间用相同协议、Host 和请求类型直连准确上游。一次成功不能排除间歇 worker 回收、失效长连接或单个坏实例。

3. 确认上游进程或套接字持有者

按 upstream 地址聚类失败,并对齐 worker timeout、崩溃、OOM、发布排空、max-request 回收、请求大小、协议错配或更短的后端 keepalive。复用连接还要比较接近零的连接时间与后端空闲关闭策略。

不要把所有 502 都叫缓冲区问题。NGINX 能说明失败阶段,但只有进程管理器和应用日志能解释对端为何关闭。重启前保留两侧证据。

4. 只修改已证实的边界

应用崩溃、内存限制和异常要在应用侧修;发布时排空 worker,对齐 keepalive,修正 HTTP/HTTPS,或只在时间线支持时把长阻塞任务移出 worker timeout。

只有后端仍存活且确实在两次响应读取间合法停顿时才提高 proxy_read_timeout。修改 worker timeout 前要测并发容量。POST/PATCH 未控制重复副作用时不要启用重试。

5. 安全重放并设置退出门槛

先对识别出的单个后端,再经 NGINX 重放同类请求;覆盖正常路径、原慢路径、发布或回收边界及复用连接,并验证状态、正文完整与副作用恰好一次。

代表性负载下要求 502 率受控、无相关 worker 退出、延迟稳定且重试安全。若更改只是推迟失败、重复写入或掩盖坏实例,就回滚并回到时间线。

上游关闭的观察、修复与验收示意图
原创插画:只做一项证据匹配的更改并安全重放。 Watch at Ease