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,就是哪台服務器上部署的應用程序有問題(不管是服務端還是客戶端),無論是開源服務,還是自己開發的應用程序,在此基礎上分析問題。一般為代碼邏輯或訪問外部資源問題導致。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM