先看官網文檔中的描述
官網文檔中解釋max_fails是指在fail_timeout配置的時間內,伺服器通信失敗的次數,默認為1,即在fail_timeout時間內,1次請求失敗即不再嘗試,將請求根據hash規則,轉發到下一個上遊服務
fail_timeout有兩種含義:
默認是10s
文字不是很好理解,搭建個實驗環境,環境如下:
nginx通過fast-cgi將php請求轉發到PHP-FPM,這裡PHP-FPM服務即上遊服務,設置upstream,負載PHP-FPM
upstream按照默認配置,即max_fails=1,fail_timeout=10
現在通過tailf分別監聽兩個PHP-FPM日誌
請求4次,因為是默認輪詢的,所以可以看時間,輪詢將請求分發到兩個PHP-FPM上遊
可以從上面的日誌中看到,按照輪詢規則,下次請求應該落到PHP-FPM2上面,接著,關掉PHP-FPM1,繼續請求
可以看到,PHP-FPM1肯定是不響應了,PHP-FPM2正常響應,接著看下Nginx日誌
可以看到,關掉PHP-FPM1後,發起的請求,本來第二次請求(17:49:58)應該分發到PHP-FPM1的,然後從Nginx錯誤日誌可以看到,連接PHP-FPM1失敗,這裡只做了一次失敗嘗試,然後Nginx將請求轉發到PHP-FPM2處理了
接著將max_fails設置為2,繼續上面的請求
開啟PHP-FPM1,繼續請求,兩個負載輪詢轉發請求
接著繼續關掉PHP-FPM1,連續發起多次請求,查看日誌
所有請求都在PHP-FPM2上,看Nginx錯誤日誌
兩次輪詢到PHP-FPM1的時候,失敗,之後不會再將請求分發到PHP-FPM1上遊服務
接著,不開啟PHP-FPM1,繼續發起多次請求,由於默認的fail_timeout=10,所以在上面的失敗檢測10s之後再次發起請求,查看日誌
繼續分發到PHP-FPM2,接著看Nginx錯誤日誌
可以看到,過了fail_timeout的時間後,Ngxin會再次將請求發往FPM-PHP1進行嘗試,嘗試2次失敗後,在fail_timeout時間內,不會再將請求分發,
這裡有幾個誤區:
這個理解是錯誤的,Nginx只是記錄了失敗的請求到日誌,並將這個請求又轉發到了可用的其他上遊服務,知道所有上遊都不可用時,才會返回錯誤狀態
max_fails是在fail_timeout指定的時間內的失敗次數,請求還是按照配置的負載均衡算法來走,並不是第一次請求失敗之後,繼續將這個請求在嘗試一次,達到失敗次數之後,標記為不可用
當訪問量大的時候,fail_timeout設置太短,會導致不斷的嘗試與不可用上遊的連接,耗費大量的tcp資源進行連接
當訪問量大的時候,fail_timeout設置太長,會導致負載不均衡,有可能會擊穿某個上遊後端,達不到負載的效果
--- EOF ---