当前位置: 首页 > news >正文

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 错误,提升服务稳定性。

相关文章:

  • 二分查找的边界问题
  • Python训练营打卡——DAY25(2025.5.14)
  • [论文阅读]Formalizing and Benchmarking Prompt Injection Attacks and Defenses
  • MySQL 学习(九)bin log 与 redo log 的区别有哪些,为什么快速恢复使用 redo log 而不用 bin log?
  • 基于javaweb的SpringBoot高校图书馆座位预约系统设计与实现(源码+文档+部署讲解)
  • 深度强化学习 | 图文详细推导软性演员-评论家SAC算法原理
  • html js 原生实现web组件、web公共组件、template模版插槽
  • Go 语言 sqlx 库使用:对 MySQL 增删改查
  • 破解商业综合体清洁管理困局:商业空间AI智能保洁管理系统全场景解决方案
  • 知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑
  • Flink CDC—实时数据集成框架
  • 【论文笔记】ViT-CoMer
  • CCF第七届AIOps国际挑战赛季军分享(RAG)
  • HTML 颜色全解析:从命名规则到 RGBA/HSL 值,附透明度设置与场景应用指南
  • 【HCIA】BFD
  • linux内核主要由哪五个模块构成?
  • 网络协议分析 实验七 FTP、HTTP、DHCP
  • Linux相关概念和易错知识点(39)(URL、HTTP)
  • MK米客方德SD NAND:无人机存储的高效解决方案
  • HTTP 连接复用机制详解
  • 腾讯一季度营收增长13%,马化腾:战略性的AI投入将带来长期回报
  • 台行政机构网站删除“汉人”改为“其余人口”,国台办回应
  • 国产水陆两栖大飞机AG600批产首架机完成总装下线
  • 《审判》|“被告”的魅力:K在等什么?
  • 长沙通报一出租房疑存非法代孕:查封涉事场所,相关人员被控制
  • 观众走入剧院空间,人艺之友一起“再造时光”