nginx 出现大量connect reset by peer

当 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 防火墙规则、客户端异常行为 tcpdumpiptables -L -n
伴随 502/504 错误 后端服务健康状态、代理超时设置 Nginx error.log、后端服务日志
集中在特定接口 接口性能、数据库查询优化 slowlog、APM 工具(如 SkyWalking)
网络设备日志显示 RST 负载均衡器/防火墙配置 云平台监控、设备日志分析

通过系统化排查和针对性优化,可有效减少 connection reset by peer 错误,提升服务稳定性。

相关推荐
蹦蹦跳跳真可爱5898 分钟前
Python----神经网络(《Inverted Residuals and Linear Bottlenecks》论文概括和MobileNetV2网络)
网络·人工智能·python·深度学习·神经网络
像风一样自由202040 分钟前
局部放电在线监测系统的数据传输协议选择研究:Modbus TCP 与 MQTT
网络·网络协议·tcp/ip
PHASELESS4111 小时前
TCP协议十大核心特性深度解析:构建可靠传输的基石
网络·网络协议·tcp/ip
jstart千语1 小时前
【消息队列】RabbitMQ基本认识
java·服务器·分布式·rabbitmq
wanhengidc2 小时前
SCDN能够运用在物联网加速当中吗?
运维·服务器·网络
leona_nuaa2 小时前
p2p虚拟服务器
服务器·网络协议·p2p
wangchen_02 小时前
linux-信号保存和处理
linux·运维·服务器
小白自救计划2 小时前
网络协议分析 实验七 FTP、HTTP、DHCP
网络·网络协议·http
Chandler242 小时前
Go 语言 net/http 包使用:HTTP 服务器、客户端与中间件
服务器·http·golang
z人间防沉迷k3 小时前
互联网协议的多路复用、Linux系统的I/O模式
linux·网络·http