“connection reset”是nginx在资源或策略层面主动发送tcp rst包的明确信号,非后端崩溃或客户端错误;根源包括系统连接队列溢出(需调大net.core.somaxconn及nginx listen backlog)、超时设置过短、ssl/tls握手异常、或中间设备(如waf、防火墙)干预,须通过tcpdump抓包准确定位rst来源。

高并发下 Nginx 出现“Connection reset”不是偶然,而是它在资源或策略层面主动切断连接的明确信号。核心在于:这不是后端崩了、也不是 JMeter 写错了,是 Nginx 在连接建立中或数据传输中途发出了 TCP RST 包。解决的关键是识别它“为什么拒绝”,然后针对性调优。
检查并调大系统级连接队列限制
Nginx worker 进程能排队等待处理的新连接数,受限于 Linux 内核参数 net.core.somaxconn。默认值(如 4096 或更低)在高并发压测中极易打满,新连接被内核直接丢弃并返回 RST。
- 查看当前值:
sysctl net.core.somaxconn - 临时调大:
sudo sysctl -w net.core.somaxconn=65535 - 永久生效:在
/etc/sysctl.conf中添加net.core.somaxconn = 65535,再执行sysctl -p - 确认 Nginx 配置中
listen指令带了backlog=65535(例如:listen 80 backlog=65535;)
优化 Nginx 连接生命周期与超时设置
短连接密集请求下,过短的超时会误杀合法连接;Keep-Alive 复用不合理也会加剧连接震荡。
- 适当延长关键超时(单位建议用秒):
client_header_timeout 60;<br> client_body_timeout 60;<br> keepalive_timeout 75 75;<br> send_timeout 60;
- 若业务支持长连接,增大 keepalive 请求上限:
keepalive_requests 10000; - 避免客户端反复建连,可在 upstream 中开启健康检查并合理配置
max_fails和fail_timeout
排查 SSL/TLS 层面的握手异常
HTTPS 场景下,“连接重置”常发生在 TLS 握手完成后的首个应用数据包,典型诱因是会话缓存缺失或加密套件不兼容。
- 必须启用 SSL 会话缓存:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h; - 禁用老旧不安全协议:
ssl_protocols TLSv1.2 TLSv1.3; - 使用现代兼容套件(避免包含
SSLv3、RC4、NULL等) - 若用 ECC 证书,确保私钥格式和 nginx 版本兼容(部分旧版本对 ECDSA 支持不完整)
验证 RST 的真实来源与网络路径
不能默认认为是 Nginx 发的 RST——中间设备(WAF、云防火墙、运营商 DPI)也可能主动干预未备案域名或异常流量。
- 用
tcpdump抓包确认 RST 包的 IP 和端口归属:tcpdump -i any 'tcp[tcpflags] & (tcp-rst) != 0' -nn -c 10 - 对比服务端与客户端抓包:若服务端没发 RST,但客户端收到了,说明中断发生在链路中间
- 国内环境特别注意域名是否完成 ICP 备案,未备案域名在某些运营商出口可能被策略性 RST
- 检查防火墙规则(如 ufw、iptables)是否拦截了 ESTABLISHED 连接的后续数据包











