当 Nginx 出现大量 connection reset by peer
错误时,通常意味着客户端(或中间网络设备)主动发送了 TCP RST 包终止了连接。以下是系统化的排查步骤和解决方案:
一、问题原因分析
原因分类 | 具体场景 | 特征 |
---|---|---|
客户端主动终止 | 用户在请求过程中关闭浏览器、客户端代码异常退出、移动端网络切换 | 日志中无规律出现,客户端 IP 分散 |
服务端配置不当 | Nginx 或后端服务超时设置过短、Keep-Alive 配置不合理 | 集中出现在高延迟请求或特定接口 |
网络问题 | 防火墙/负载均衡器主动断开空闲连接、网络丢包、MTU 不匹配 | 伴随 TCP 重传或 packet loss 日志 |
后端服务异常 | 后端服务崩溃、响应过慢、返回非法数据 | 关联后端错误日志(如 502/504) |
攻击或滥用 | DDoS 攻击、爬虫高频请求、恶意扫描 | 来自少量 IP 的高频异常请求 |
二、排查步骤与工具
1. 查看 Nginx 日志定位规律
1)检查错误日志 (error.log
):
grep "reset by peer" /var/log/nginx/error.log
统计错误频率、关联的客户端 IP 和请求 URL。
2)分析访问日志 (access.log
):
awk '{print $1, $7, $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
查看高频请求的客户端 IP、URL 和状态码。
2. 监控网络连接状态
1)查看当前连接状态:
ss -ant | awk '{print $1}' | sort | uniq -c # 统计各 TCP 状态数量
netstat -n | grep :80 | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' # 按状态分类统计
-
关注
CLOSE_WAIT
(服务端未关闭)、TIME_WAIT
(正常关闭)数量。 -
抓包分析 RST 来源:
tcpdump -i eth0 'tcp[tcpflags] & (tcp-rst) != 0' -nn # 捕获 RST 包
- 确定 RST 是由客户端还是服务端发送。
3. 检查服务端配置
-
Nginx 超时参数:
http { client_header_timeout 60s; # 客户端请求头读取超时 client_body_timeout 60s; # 客户端请求体读取超时 keepalive_timeout 75s; # Keep-Alive 连接超时 send_timeout 60s; # 响应发送超时 }
- 适当增大超时时间(根据业务需求调整)。
-
后端服务健康检查:
upstream backend { server 10.0.0.1:8080 max_fails=3 fail_timeout=30s; server 10.0.0.2:8080 max_fails=3 fail_timeout=30s; }
- 确保后端服务可用,避免因超时返回 RST。
4. 检查系统资源与内核参数
-
资源监控:
top -c # 查看 CPU、内存使用 dstat -n --tcp # 监控网络流量和 TCP 状态
- 排除 CPU、内存、带宽瓶颈。
-
优化内核参数 (
/etc/sysctl.conf
):net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.tcp_keepalive_intvl = 15 net.ipv4.tcp_max_tw_buckets = 200000 # 限制 TIME_WAIT 数量 net.ipv4.tcp_tw_reuse = 1 # 允许复用 TIME_WAIT 连接 执行 sysctl -p 生效。
三、解决方案
场景 1:客户端主动断开
-
优化客户端体验:
-
增加前端重试机制(如 HTTP 503 响应时自动重试)。
-
使用 WebSocket 替代频繁的短连接请求。
-
场景 2:服务端配置问题
-
调整超时参数:
location /api { proxy_connect_timeout 60s; proxy_read_timeout 300s; # 根据后端服务响应时间调整 proxy_send_timeout 300s; }
场景 3:网络或中间设备问题
-
检查防火墙/负载均衡器:
-
确认未设置过短的 TCP 空闲超时(如 AWS ELB 默认 60 秒)。
-
调整 MTU 避免分片(通常 1500,云环境可能需要 1450)。
-
场景 4:后端服务异常
-
优化后端性能:
-
检查数据库慢查询、代码死锁、资源泄漏。
-
添加服务熔断机制(如 Hystrix、Resilience4j)。
-
场景 5:恶意攻击
-
防御策略:
-
使用 Nginx 限流:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; location / { limit_req zone=one burst=20; }
-
启用 WAF(如 ModSecurity)拦截恶意请求。
-
四、验证与监控
-
日志监控:
- 使用 ELK(Elasticsearch + Logstash + Kibana)实时分析 Nginx 日志。
-
网络监控:
- Prometheus + Grafana 监控 TCP 连接状态和错误率。
-
压测验证:
ab -n 1000 -c 100 http://example.com/api # Apache Bench 测试
总结
症状 | 优先检查项 | 工具/命令 |
---|---|---|
高频 RST 来自特定 IP | 防火墙规则、客户端异常行为 | tcpdump 、iptables -L -n |
伴随 502/504 错误 | 后端服务健康状态、代理超时设置 | Nginx error.log、后端服务日志 |
集中在特定接口 | 接口性能、数据库查询优化 | slowlog 、APM 工具(如 SkyWalking) |
网络设备日志显示 RST | 负载均衡器/防火墙配置 | 云平台监控、设备日志分析 |
通过系统化排查和针对性优化,可有效减少 connection reset by peer
错误,提升服务稳定性。