Nginx負載均衡的max_fails和fail_timeout的預設配置問題

jiayou111發表於2024-08-12

今天發現一個奇怪的現象,前端請求後端服務多次後會超時一次,經過多次驗證確定是大概10s左右就會超時一次,檢查後端服務,發現其中一個節點已經夯死。

但是我們的nginx負載均衡策略是輪詢機制,按照配置來看應該是每隔一次請求輪詢到失敗的節點時超時一次才對。為什麼是每隔10s超時一次呢?

upstream app_server {
  server 192.168.15.98:9080 max_fails=1 fail_timeout=10s;
  server 192.168.15.99:9080 max_fails=1 fail_timeout=10s;
}

原來,Nginx負載均衡的檢查模組中,有兩個引數:max_fails和fail_timeout。

預設:fail_timeout為10s,max_fails為1次。

原理:Nginx是基於連線探測的,如果發現後端異常,在單位週期為fail_timeout設定的時間中失敗次數達到max_fails次,這個週期次數內,如果後端同一個節點不可用,那麼就將把節點標記為不可用,並等待下一個週期(同樣時長為fail_timeout)再一次去請求,判斷是否連線是否成功。

這樣就能說明我們發現的現象了。即在10s以內後端失敗了1次【即1次請求超時】,那麼這個後端就被標識為不可用了,所以在接下來的10s期間,nginx都會把請求分配給正常的後端【即多次的請求正常】。

相關文章