Nginx負(fù)載均衡使用心得
前一段時(shí)間在負(fù)責(zé)實(shí)施一個(gè)項(xiàng)目,利用nginx的七層負(fù)載均衡的良好性能做調(diào)度器,后端兩臺(tái)PHP應(yīng)用服務(wù)器,實(shí)現(xiàn)靜動(dòng)態(tài)分離處理,在整個(gè)系統(tǒng)環(huán)境全部部署完后,把應(yīng)用程序放上去測(cè)試時(shí),發(fā)現(xiàn)一個(gè)問(wèn)題,現(xiàn)把問(wèn)題和解決辦法寫(xiě)出來(lái),與大家一起分享和討論。
一、系統(tǒng)環(huán)境:
1、nginx負(fù)載均衡/反向代理服務(wù)器(1臺(tái))
環(huán)境:CentOS 5.5 nginx-0.7.65
IP:192.168.0.10
2、后端PHP應(yīng)用服務(wù)器(2臺(tái))
環(huán)境:CentOS 5.***pache + PHP
Webserver1 IP:192.168.0.20
Webserver1 IP:192.168.0.21
二、安裝配置
1、安裝nginx負(fù)載均衡/反向代理服務(wù)器
安裝過(guò)程就不詳說(shuō)了,可以參考我另一篇文章《nginx+tomcat負(fù)載均衡集群安裝配置》,nginx負(fù)載均衡/反向代理配置如下:
…
upstream phpserver {
server 192.168.0.20:80 weight=5;
server 192.168.0.21:80 weight=5;
}
…
server {
listen 80;
server_name localhost;
root /webroot;
index index.php index.html index.htm;
location ~ .*\.(php|php5)?$ {
proxy_pass http://phpserver;
include proxy.conf;
}
location ~ /\..+ {
deny all;
}
access_log /var/log/nginx/access.log;
}
2、后端PHP應(yīng)用服務(wù)器的詳細(xì)安裝配置遲些再寫(xiě)出來(lái);#p#
三、測(cè)試發(fā)現(xiàn)的問(wèn)題及解決辦法
1、當(dāng)后端兩臺(tái)PHP應(yīng)用服務(wù)器都正常時(shí),訪問(wèn)速度非??欤榭慈罩?,原來(lái)一個(gè)請(qǐng)求,是后端兩臺(tái)服務(wù)器同時(shí)響應(yīng)的;
2、為了模仿故障測(cè)試,停掉一臺(tái)PHP應(yīng)用服務(wù)器,這時(shí)再訪問(wèn),請(qǐng)求打開(kāi)一頁(yè)面時(shí),發(fā)現(xiàn)有一半響應(yīng)比較快,另一半響應(yīng)很慢,***頁(yè)面是可以打開(kāi),但速度不理想,很慢,查看error日志,發(fā)現(xiàn)nginx還是把請(qǐng)求的一半發(fā)往已停掉的那臺(tái)服務(wù)器,難怪會(huì)這么慢;但當(dāng)很快(10秒內(nèi))再打開(kāi)一個(gè)請(qǐng)求頁(yè)面時(shí),速度又非??炝?,查看日志,發(fā)現(xiàn)nginx不會(huì)把請(qǐng)求的一半發(fā)往已停掉的那臺(tái)服務(wù)器;過(guò)一會(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è)問(wèn)題呢,當(dāng)后端有一臺(tái)服務(wù)器down機(jī)時(shí),用戶訪問(wèn)感覺(jué)不出有慢的現(xiàn)象?原來(lái)在nginx負(fù)載均衡配置里加上下面兩個(gè)參數(shù)時(shí)可以有效的解決這個(gè)問(wèn)題:
upstream phpserver {
server 192.168.0.20:80 weight=5 max_fails=2 fail_timeout=600s;
server 192.168.0.21:80 weight=5 max_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í)間沒(méi)有直接關(guān)系,不過(guò)可以使用proxy_connect_timeout和 proxy_read_timeout來(lái)控制。
我設(shè)置當(dāng)有2個(gè)請(qǐng)求失敗,就表示后端的服務(wù)器不可用,在以后的600S時(shí)間內(nèi)nginx不會(huì)再把請(qǐng)求發(fā)往已檢查出標(biāo)記為不可用的服務(wù)器,再次測(cè)試時(shí),把后端一臺(tái)PHP應(yīng)用服務(wù)務(wù)器停掉,只是有一個(gè)請(qǐng)求打開(kāi)頁(yè)面時(shí)出現(xiàn)上面的現(xiàn)象,以后10分鐘內(nèi)都不會(huì)出現(xiàn)了,請(qǐng)求頁(yè)面打開(kāi)速度正常,fail_timeout的值可以根據(jù)你的實(shí)際情況而定。
原文地址:http://xianghehexiang.blog.51cto.com/2555793/462673