插件窝 干货文章 nginx日志中的“connection reset by peer”怎么处理

nginx日志中的“connection reset by peer”怎么处理

超时 连接 客户端 Nginx 284    来源:    2025-05-07

解决Nginx日志中的"connection reset by peer"问题

"connection reset by peer"是Nginx日志中常见的错误,表示客户端在连接过程中突然断开了连接。以下是分析和解决方法:

原因分析

  1. 客户端主动断开:用户关闭浏览器或取消请求
  2. 网络问题:不稳定的网络连接导致中断
  3. 超时设置不当:客户端或服务器超时设置不合理
  4. 防火墙/安全设备拦截:中间网络设备中断了连接
  5. 服务器负载过高:服务器无法及时响应
  6. 客户端应用问题:移动应用或脚本错误处理连接

解决方案

1. 调整Nginx超时设置

http {
    # 增加连接超时时间
    keepalive_timeout 60;

    # 客户端请求体读取超时
    client_body_timeout 30;

    # 客户端请求头读取超时
    client_header_timeout 30;

    # 发送响应超时
    send_timeout 30;

    # 代理连接超时
    proxy_connect_timeout 60;
    proxy_send_timeout 60;
    proxy_read_timeout 60;
}

2. 优化TCP参数

http {
    # 启用TCP_NODELAY
    tcp_nodelay on;

    # 启用TCP_NOPUSH
    tcp_nopush on;

    # 调整发送缓冲区大小
    sendfile on;
    sendfile_max_chunk 512k;
}

3. 调整内核参数

# 增加TCP最大连接数
echo "net.ipv4.tcp_max_syn_backlog = 8192" >> /etc/sysctl.conf

# 增加等待连接队列大小
echo "net.core.somaxconn = 8192" >> /etc/sysctl.conf

# 启用TCP快速回收
echo "net.ipv4.tcp_tw_recycle = 1" >> /etc/sysctl.conf

# 启用TCP快速重用
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf

# 应用修改
sysctl -p

4. 监控和日志分析

  • 使用grep分析日志频率:

    grep "connection reset by peer" /var/log/nginx/error.log | awk '{print $1}' | sort | uniq -c | sort -nr
    
  • 检查是否来自特定IP:

    grep "connection reset by peer" /var/log/nginx/error.log | awk '{print $NF}' | cut -d':' -f1 | sort | uniq -c | sort -nr
    

5. 其他优化措施

  1. 启用keepalive

    upstream backend {
       keepalive 32;
    }
    
  2. 调整worker连接数

    events {
       worker_connections 4096;
    }
    
  3. 检查防火墙设置,确保没有主动断开长连接

何时需要关注

  • 当错误频率异常高时(超过总请求的1%)
  • 集中在特定时间段出现
  • 来自特定客户端IP或用户代理

如果问题持续存在,可能需要: 1. 检查客户端应用代码 2. 进行网络链路质量测试 3. 考虑使用CDN或负载均衡分散流量

大多数情况下,这些错误是正常的客户端行为,无需过度优化,除非它们影响了用户体验或服务器性能。