“Connection reset by peer”本质是TCP层RST包触发的强制断连,需先通过日志上下文(如upstream/client关键词)定位RST来源方向,再抓包确认源IP,最后排查后端崩溃、超时配置不匹配、资源耗尽或协议违规等根本原因。

长连接频繁断开,尤其是 Java 或 Go 后端服务配合 Nginx 反向代理时出现 Connection reset by peer,本质不是“连不上”,而是连接建好后被某一方主动发 RST 强制中断。关键要分清:谁发的 RST?为什么发?
先看日志,锁定 RST 来源方向
Nginx 错误日志本身不直接写“谁发了 RST”,但上下文线索很明确:
- 含
while reading response header from upstream或upstream prematurely closed connection→ RST 极大概率来自后端(Java/Tomcat、Go/gorilla/websocket 等) - 含
while sending to client且错误 IP 分散、时间点零散 → 更可能是客户端侧异常(浏览器关闭、移动端切网、前端未 abort 请求) - 错误集中爆发、固定间隔(如每 90 秒一批)、后端无对应日志 → 高概率是中间设备(云 SLB、WAF、防火墙)空闲超时强制回收连接
重点检查 Nginx 与长连接强相关的四类配置
这些参数不匹配后端行为,会直接触发 RST,尤其对 WebSocket 或 HTTP/1.1 keep-alive 场景:
- proxy_read_timeout:控制 Nginx 从后端读数据的等待上限。默认 60 秒太短。WebSocket 握手后若无心跳帧,Nginx 就发 FIN 断连。建议设为 ≥ 前端心跳间隔 × 2.5(如前端每 45 秒 ping 一次,这里至少 120 秒)。不能设为 0,Nginx 会退化回默认值。
-
Upgrade / Connection 头透传:WebSocket 升级必须携带
Upgrade: websocket和Connection: Upgrade。Nginx 默认不转发这两个头。需在 location 块中显式添加:proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";
第二行双引号不可省,否则 upgrade 被解析为空字符串,导致握手失败或后续帧异常。 -
proxy_buffering off:WebSocket 依赖精确帧边界(FIN bit、opcode)。若开启 buffering(默认 on),Nginx 会攒帧发送,破坏协议结构,客户端解析失败。必须禁用:
proxy_buffering off; - proxy_http_version 1.1:确保复用连接。HTTP/1.0 不支持 keep-alive,降级会导致连接无法复用。该指令应放在 location 块内,避免影响其他接口。
验证后端是否真“稳住”了连接
Nginx 断连常是后端先松手的结果。需同步排查后端服务:
立即学习“Java免费学习笔记(深入)”;
-
Java(Tomcat):检查
connectionTimeout(默认 20000ms=20s)是否远小于 Nginx 的proxy_read_timeout。若后端先关空闲连接,Nginx 下次复用就会收到 RST。建议调大至 300000ms(5 分钟)以上,并确认maxKeepAliveRequests未设为 1。 -
Go(gorilla/websocket):确认服务端未设置过短的读写超时(如
conn.SetReadDeadline)。Nginx 是代理,不是客户端,后端应以 Nginx 的proxy_read_timeout为参考来设自身超时。 -
通用资源检查:用
lsof -i :8080 | wc -l查后端连接数,对比其ulimit -n;查dmesg | grep -i "killed process"排除 OOM Killer 终止进程。
抓包确认 RST 源头,避免误判
仅靠日志易走偏,tcpdump 是黄金标准:
- 在 Nginx 服务器执行:
tcpdump -i any 'tcp[tcpflags] & (tcp-rst) != 0 and port 80 or port 443' -nn -c 20 - 观察输出中的源 IP:若为后端地址(如 10.0.0.5:8080),说明后端应用层 close;若为客户端 IP,则问题出在调用方或中间网络。
- 配合 access.log 中的
$upstream_response_time:若为 “–” 或极小值,请求根本没发出去;若接近 timeout 值,说明后端处理慢或超时后主动 RST。


















