Nginx 出现“connection reset by peer”表示对端主动发送TCP RST强制断连,需结合日志、抓包和配置联动排查:一查错误类型(upstream/client/网络设备触发),二调超时与缓冲参数(如proxy_read_timeout、proxy_buffer_size),三验后端健康状态及协议合规性。

这个错误表示 Nginx 在与另一端(客户端或上游服务)通信时,对方突然发送了 TCP RST 包强制终止连接。它不是超时或拒绝连接,而是“正在传数据时被硬断开”,关键要判断谁发的 RST、为什么发。
常见触发场景及对应特征
错误本身不指明责任方,需结合日志上下文定位:
-
上游服务(如 Tomcat、PHP-FPM、Node.js)主动重置:日志中明确含
while reading response header from upstream或while proxying and reading from upstream;同时后端服务日志常出现崩溃、OOM、线程卡死或配置限制(如 Tomcat 的maxHttpHeaderSize不足、PHP-FPM 的request_terminate_timeout触发) -
客户端侧异常中断:日志显示
while sending to client;IP 分散、请求 URL 随机、多见于移动端切网、浏览器关闭、爬虫断连或前端 AJAX 未正确 abort - 中间网络设备干预:如云厂商 SLB、防火墙、WAF 对空闲连接强制回收(尤其 keepalive 超时设置不一致),表现为固定时间间隔集中报错,且无后端异常日志
-
协议或数据违规:上游返回非法 HTTP 响应头(如缺失
Status行)、响应体长度与Content-Length不符、或客户端发送超大 header/body 被某层截断并 RST
Nginx 层可调的关键配置项
这些参数直接影响连接稳定性,修改前建议先确认是否匹配后端能力:
-
超时类:
proxy_connect_timeout、proxy_send_timeout、proxy_read_timeout(对 HTTP 后端);fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout(对 PHP-FPM)——值应略大于后端处理最大耗时 -
缓冲区类:
proxy_buffer_size(必须 ≥ 后端响应头大小)、proxy_buffers、large_client_header_buffers、client_max_body_size——防止因缓冲不足导致连接被丢弃 -
连接复用类:
keepalive_timeout(Nginx 与客户端)、proxy_http_version 1.1+proxy_set_header Connection ''(保持与上游长连接)——避免频繁建连放大 RST 概率
快速定位步骤
不要只盯一条错误日志,要联动分析:
- 查
error.log中同一时间点是否密集出现,是否集中在某几个 upstream 地址或 client IP - 对照
access.log,提取报错请求的$request_time和$upstream_response_time,若后者为 “-” 或极小,说明请求根本没发到上游;若后者接近 timeout 值,大概率是上游处理超时后主动 RST - 抓包验证(如
tcpdump -i any port 80 or port 443 -w nginx_rst.pcap):过滤出报错请求的 TCP 流,确认 RST 包由哪一端发出(源 IP 是 upstream 则问题在后端,是 client 则问题在前端或网络) - 检查后端服务状态:CPU/内存使用率、线程数、连接池占用、错误日志中是否有 OOMKill、SIGKILL、段错误等记录
典型修复案例参考
真实问题往往藏在细节里:
- Tomcat 接收超大请求头失败 → 在
server.xml的Connector中增加maxHttpHeaderSize="65536" - PHP-FPM 进程被 request_terminate_timeout 杀掉 → 将
request_terminate_timeout = 0(慎用)或调高至合理值,并确保proxy_read_timeout≥ 该值 - Kubernetes 中 Nginx 访问 kube-apiserver 报 RST → 检查 apiserver 是否启用了动态证书轮换,旧连接因证书失效被主动断开;或调整
proxy_ssl_verify off(测试环境)及proxy_ssl_trusted_certificate(生产) - 云负载均衡器空闲超时(如阿里云 SLB 默认 900 秒)< Nginx
keepalive_timeout→ 统一设为 600 秒并重启双方


















