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

Nginx配置終極指南

Nginx緩存配置詳解

常見(jiàn)網(wǎng)絡(luò)負(fù)載均衡的幾種方式
常見(jiàn)的lvs負(fù)載均衡算法
Nginx日常運(yùn)維方法Linux版

常用的服務(wù)器負(fù)載均衡多少錢(qián)一臺(tái)?
確保網(wǎng)站無(wú)縫運(yùn)行:Keepalived高可用與Nginx集成實(shí)戰(zhàn)

多鏈路負(fù)載均衡設(shè)置在哪里?
華納云:什么是負(fù)載均衡??jī)?yōu)化資源利用率的策略
天翼云彈性負(fù)載均衡介紹

評(píng)論