之前有很多朋友問關于Nginx的upstream模塊中max_fails及fail_timeout,這兩個指令,分別是配置關于負載均衡過程中,對于上游(后端)服務器的失敗嘗試次數(shù)和不可用時間,很多人不是很理解這兩個參數(shù)到底怎么用,以及具體的含義
先看官網(wǎng)文檔中的描述
官網(wǎng)文檔中解釋max_fails是指在fail_timeout配置的時間內(nèi),服務器通信失敗的次數(shù),默認為1,即在fail_timeout時間內(nèi),1次請求失敗即不再嘗試,將請求根據(jù)hash規(guī)則,轉發(fā)到下一個上游服務
fail_timeout有兩種含義:
當已經(jīng)確認上游服務不可用時,是指與上游服務器通信失敗次數(shù)的時間
服務器不可用的時間段
默認是10s
文字不是很好理解,搭建個實驗環(huán)境,環(huán)境如下:
Nginx
PHP-FPM(x2)
nginx通過fast-cgi將php請求轉發(fā)到PHP-FPM,這里PHP-FPM服務即上游服務,設置upstream,負載PHP-FPM
upstream按照默認配置,即max_fails=1,fail_timeout=10
現(xiàn)在通過tailf分別監(jiān)聽兩個PHP-FPM日志
請求4次,因為是默認輪詢的,所以可以看時間,輪詢將請求分發(fā)到兩個PHP-FPM上游
可以從上面的日志中看到,按照輪詢規(guī)則,下次請求應該落到PHP-FPM2上面,接著,關掉PHP-FPM1,繼續(xù)請求
可以看到,PHP-FPM1肯定是不響應了,PHP-FPM2正常響應,接著看下Nginx日志
可以看到,關掉PHP-FPM1后,發(fā)起的請求,本來第二次請求(1758)應該分發(fā)到PHP-FPM1的,然后從Nginx錯誤日志可以看到,連接PHP-FPM1失敗,這里只做了一次失敗嘗試,然后Nginx將請求轉發(fā)到PHP-FPM2處理了
接著將max_fails設置為2,繼續(xù)上面的請求
開啟PHP-FPM1,繼續(xù)請求,兩個負載輪詢轉發(fā)請求
接著繼續(xù)關掉PHP-FPM1,連續(xù)發(fā)起多次請求,查看日志
所有請求都在PHP-FPM2上,看Nginx錯誤日志
兩次輪詢到PHP-FPM1的時候,失敗,之后不會再將請求分發(fā)到PHP-FPM1上游服務
接著,不開啟PHP-FPM1,繼續(xù)發(fā)起多次請求,由于默認的fail_timeout=10,所以在上面的失敗檢測10s之后再次發(fā)起請求,查看日志
繼續(xù)分發(fā)到PHP-FPM2,接著看Nginx錯誤日志
可以看到,過了fail_timeout的時間后,Ngxin會再次將請求發(fā)往FPM-PHP1進行嘗試,嘗試2次失敗后,在fail_timeout時間內(nèi),不會再將請求分發(fā),
這里有幾個誤區(qū):
Nginx記錄了連接上游失敗,這個請求就返回錯誤請求,或這個請求丟失沒處理
這個理解是錯誤的,Nginx只是記錄了失敗的請求到日志,并將這個請求又轉發(fā)到了可用的其他上游服務,知道所有上游都不可用時,才會返回錯誤狀態(tài)
max_fails是指連續(xù)請求失敗的次數(shù)
max_fails是在fail_timeout指定的時間內(nèi)的失敗次數(shù),請求還是按照配置的負載均衡算法來走,并不是第一次請求失敗之后,繼續(xù)將這個請求在嘗試一次,達到失敗次數(shù)之后,標記為不可用
fail_timeout越短越好
當訪問量大的時候,fail_timeout設置太短,會導致不斷的嘗試與不可用上游的連接,耗費大量的tcp資源進行連接
fail_timeout越長越好
當訪問量大的時候,fail_timeout設置太長,會導致負載不均衡,有可能會擊穿某個上游后端,達不到負載的效果
編輯:jq
-
服務器
+關注
關注
12文章
8849瀏覽量
84952 -
PHP
+關注
關注
0文章
452瀏覽量
26614 -
負載均衡
+關注
關注
0文章
101瀏覽量
12346
原文標題:Nginx負載均衡配置誤區(qū)
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論