測(cè)試發(fā)現(xiàn)的問題及解決辦法
1笔咽、當(dāng)后端兩臺(tái)應(yīng)用服務(wù)器都正常時(shí)搔预,訪問速度非常快叶组,查看日志拯田,原來一個(gè)請(qǐng)求,是后端兩臺(tái)服務(wù)器同時(shí)響應(yīng)的;
2甩十、為了模仿故障測(cè)試船庇,停掉一臺(tái)應(yīng)用服務(wù)器吭产,這時(shí)再訪問,請(qǐng)求打開一頁面時(shí)鸭轮,發(fā)現(xiàn)有一半響應(yīng)比較快垮刹,另一半響應(yīng)很慢,最后頁面是可以打開张弛,但速度 不理想,很慢酪劫,查看error日志吞鸭,發(fā)現(xiàn)nginx還是把請(qǐng)求的一半發(fā)往已停掉的那臺(tái)服務(wù)器,難怪會(huì)這么慢;但當(dāng)很快(10秒內(nèi))再打開一個(gè)請(qǐng)求頁面時(shí), 速度又非常快了匆帚,查看日志堤尾,發(fā)現(xiàn)nginx不會(huì)把請(qǐng)求的一半發(fā)往已停掉的那臺(tái)服務(wù)器;過一會(huì)再發(fā)起一個(gè)請(qǐng)求時(shí),又出現(xiàn)有一半響應(yīng)比較快另一半響應(yīng)很慢的現(xiàn) 象了峻贮,查看日志,nginx又把請(qǐng)求的一半發(fā)往已停掉的那臺(tái)服務(wù)器;
3、到這里漓藕,我明白了nginx檢查后端應(yīng)用服務(wù)器的健康時(shí)是有一個(gè)時(shí)間間隔的,應(yīng)該怎樣處理這個(gè)問題呢挟裂,當(dāng)后端有一臺(tái)服務(wù)器down機(jī)時(shí)享钞,用戶訪問感覺不出有慢的現(xiàn)象?原來在nginx負(fù)載均衡配置里加上下面兩個(gè)參數(shù)時(shí)可以有效的解決這個(gè)問題:
upstream iisserver {
server 192.168.0.20:80 weight=5max_fails=2 fail_timeout=600s;
server 192.168.0.21:80 weight=5max_fails=2 fail_timeout=600s;
}
3.1)max_fails = NUMBER ---- 在一定時(shí)間內(nèi)(這個(gè)時(shí)間在fail_timeout參數(shù)中設(shè)置)檢查這個(gè)服務(wù)器是否可用時(shí)產(chǎn)生的最多失敗請(qǐng)求數(shù)诀蓉,默認(rèn)為1栗竖,將其設(shè)置為0可以關(guān)閉檢查,這 些錯(cuò)誤在proxy_next_upstream或fastcgi_next_upstream(404錯(cuò)誤不會(huì)使max_fails增加)中定義;
3.2)fail_timeout = TIME ---- 在這個(gè)時(shí)間內(nèi)產(chǎn)生了max_fails所設(shè)置大小的失敗嘗試連接請(qǐng)求后這個(gè)服務(wù)器可能不可用渠啤,同樣它指定了服務(wù)器不可用的時(shí)間(在下一次嘗試連接請(qǐng)求發(fā)起 之前)狐肢,默認(rèn)為10秒,fail_timeout與前端響應(yīng)時(shí)間沒有直接關(guān)系沥曹,不過可以使用proxy_connect_timeout和 proxy_read_timeout來控制份名。
我設(shè)置當(dāng)有2個(gè)請(qǐng)求失敗,就表示后端的服務(wù)器不可用架专,在以后的600S時(shí)間內(nèi)nginx不會(huì)再把請(qǐng)求發(fā)往已檢查出標(biāo)記為不可用的服務(wù)器同窘,再次測(cè)試時(shí),把 后端一臺(tái)IIS應(yīng)用服務(wù)務(wù)器停掉部脚,只是有一個(gè)請(qǐng)求打開頁面時(shí)出現(xiàn)上面的現(xiàn)象想邦,以后10分鐘內(nèi)都不會(huì)出現(xiàn)了,請(qǐng)求頁面打開速度正 常委刘,fail_timeout的值可以根據(jù)你的實(shí)際情況而定丧没。