recv() failed (104: connection reset by peer) 问题排查
最近项目中通过Nginx反向代理nodejs(采用nestjs框架)服务,压测过程中概率性出现502 Bad Gateway
,出现概率较低,大概在0.005%左右,查看日志具体报错信息为recv() failed (104: Connection reset by peer) while reading response header from upstream
,通过查找资料,了解到该报错的直接原因就是:
nodejs服务已经断开了连接,但是未通知到Nginx,Nginx还在该连接上收发数据,最终导致了该报错。
考虑到在Nginx中我们配置了打开与nodejs server的长连接,即:
proxy_http_version 1.1;
proxy_set_header Connection "";
我们先从长连接相关的设置入手查找问题,Nginx常用的几个影响长连接的参数设置有:keepalive_timeout
、keepalive_requests
、keepalive
-
1)
keepalive_timeout
: 设置客户端的长连接超时时间,如果超过这个时间客户端没有发起请求,则Nginx服务器会主动关闭长连接,Nginx默认的keepalive_timeout 75s;
。有些浏览器最多只保持 60 秒,所以我