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,就是哪台服务器上部署的应用程序有问题(不管是服务端还是客户端),无论是开源服务,还是自己开发的应用程序,在此基础上分析问题。一般为代码逻辑或访问外部资源问题导致。

 

posted @ 2018-12-13 20:43  老农夫  阅读(5401)  评论(0编辑  收藏  举报