記一次 nginx 502 問題排查解決思路和過程!
你知道的越多,不知道的就越多,業(yè)余的像一棵小草!
你來,我們一起精進!你不來,我和你的競爭對手一起精進!
編輯:業(yè)余草
blog.csdn.net/w2009211777
推薦:https://www.xttblog.com/?p=5347
記一次 nginx 502 問題排查!
總結(jié):nginx502:Tomcat調(diào)優(yōu)之a(chǎn)cceptCount
問題背景:UI 頁面點擊會偶爾返回 error,檢查調(diào)用日志,發(fā)現(xiàn) nginx 報 502 報錯,因此本文即排查 502 報錯原因。
如下紅框可知,訪問本機個備機的服務(wù) 502 了,用時 3 秒左右(可見并不是超時)。

先給出原因:是因為 tomcat8 默認的 acceptCount 是 100,請求量大的時候,會將一些來不及處理的請求塞到 acceptCount,當(dāng) acceptCount 塞滿的時候,請求會被丟棄,即我們上面說的 nginx 報的 502 錯誤。
解決方案:將 acceptCount 調(diào)大,目前線上調(diào)整到了 10000,經(jīng) 16 小時的觀察,沒有再報 502 錯誤,問題得以解決。

排查過程:
懷疑一:首先發(fā)現(xiàn) DB 的壓力突增,見圖,但是 DBA 幫排查后,這個時間點并沒有慢查詢,因此懷疑是否是服務(wù)器的問題。

懷疑二:是不是有一臺服務(wù)有問題。
但是經(jīng)排查 nginx 日志,兩臺服務(wù)都有 502 出現(xiàn)。因此這個情況排除
懷疑三:tomcat 的本身的問題。
由于 nginx 出現(xiàn) 502 的時候,時間有的只有3秒或者更小,因此也不是訪問 tomcat 超時的,所以最大的可能就是 tomcat 丟棄了請求,經(jīng)確認確實是丟棄了。
怎么證明這個推斷呢?
首先:看請求是否進入 tomcat 了,好在我們配置了 tomcat 的訪問日志記錄:配置如下:

日志:檢查 502 請求的時間,在 tomcat 里面沒有記錄日志,可見并沒有進入 tomcat,從而論證了上面的觀點:502 是因為請求被丟棄了。

那么為什么會丟棄呢?
看了一些 tomcat 的默認配置,幾個重要的配置。參考:Apache Tomcat 8 Configuration Reference (8.5.78) - The HTTP Connectorhttps://tomcat.apache.org/tomcat-8.5-doc/config/http.html。



看到一個很重要的參數(shù) acceptCount。acceptCount 是100,第一感官,太小了,超過這個隊列就被丟棄了。
acceptCount 解釋:當(dāng) maxConnections 超過 10000 萬(tomcat 默認值是10000)的時候,會將多余的連接放到 acceptCount 中,即默認的 tomcat 可以支持的最大連接數(shù)是 10000 + 100 = 10100;
當(dāng)超過 10100 的時候,請求就會被丟棄,即 nginx 的 502 日志,解決方法:將acceptCount調(diào)整成 10000。502問題得以解決。
注:
maxConnections 與 acceptCount 的關(guān)系。

