nginx 服务器出现大量CLOSE_WAIT 排查结果
1、查阅资料,查下close_wait 状态的直接原因,期间可以再次熟悉下 tcp 三次握手,四次挥手协议的基础知识。
2、通过查询资料,最终可以确定的是nginx本身问题,根据网上常推荐的两种方式分别调整系统和nginx本身的参数均无法解决此问题。
1)系统层面(快速释放空闲的tcp连接)
net.ipv4.tcp_keepalive_time=30 net.ipv4.tcp_keepalive_probes=2 net.ipv4.tcp_keepalive_intvl=2
2)nginx(参数配置)
tcp_nodelay on
3、查阅nginx本身配置,发现有引用lua脚本获取请求中的cookie id,并且相关脚本中使用了aws redis 服务,初步怀疑是redis请求延迟导致。同时也怀疑是nginx 版本bug导致,又是一通咕咕。
4、后来其他同事提醒怀疑是lua脚本问题,负责管理nginx的同事注释掉对应lua脚本并进行排查,最终定位为获取cookie id 的lua 脚本导致——去掉脚本,重启nginx问题解决。
function cookie_id() local cookie, err = ck:new() if not cookie then return "-" end local fields, err = cookie:get("JSESSIONID") if not fields then return "-" else return fields end end
总结:
根据TCP 四次挥手协议可以判断:哪台服务器出现CLOSE_WAIT,就是哪台服务器上部署的应用程序有问题(不管是服务端还是客户端),无论是开源服务,还是自己开发的应用程序,在此基础上分析问题。一般为代码逻辑或访问外部资源问题导致。