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

相关推荐
DuelCode5 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
snoopyfly~7 小时前
Ubuntu 24.04 LTS 服务器配置:安装 JDK、Nginx、Redis。
java·服务器·ubuntu
Me4神秘8 小时前
Linux国产与国外进度对垒
linux·服务器·安全
Me4神秘9 小时前
电信、移动、联通、广电跨运营商网速慢原因
网络
数通Dinner10 小时前
RSTP 拓扑收敛机制
网络·网络协议·tcp/ip·算法·信息与通信
牛奶咖啡1311 小时前
Linux系统的常用操作命令——文件远程传输、文件编辑、软件安装的四种方式
运维·服务器·软件安装·linux云计算·scp文件远程传输·vi文件编辑·设置yum的阿里云源
weixin_4373982111 小时前
转Go学习笔记(2)进阶
服务器·笔记·后端·学习·架构·golang
liulilittle11 小时前
SNIProxy 轻量级匿名CDN代理架构与实现
开发语言·网络·c++·网关·架构·cdn·通信
tan77º12 小时前
【Linux网络编程】Socket - UDP
linux·服务器·网络·c++·udp
小白爱电脑12 小时前
光纤的最小弯曲半径是多少?
网络