基于nginx高并發(fā)與負(fù)載均衡
Nginx是如何實(shí)現(xiàn)高并發(fā)的
service nginx start之后,然后輸入#ps -ef|grep nginx,會(huì)發(fā)現(xiàn)Nginx有一個(gè)master進(jìn)程和若干個(gè)worker進(jìn)程,這些worker進(jìn)程是平等的,都是被master fork過(guò)來(lái)的。在master里面,先建立需要listen的socket(listenfd),然后再fork出多個(gè)worker進(jìn)程。當(dāng)用戶進(jìn)入nginx服務(wù)的時(shí)候,每個(gè)worker的listenfd變的可讀,并且這些worker會(huì)搶一個(gè)叫accept_mutex的東西,accept_mutex是互斥的,一個(gè)worker得到了,其他的worker就歇菜了。而搶到這個(gè)accept_mutex的worker就開(kāi)始“讀取請(qǐng)求--解析請(qǐng)求--處理請(qǐng)求”,數(shù)據(jù)徹底返回客戶端之后(目標(biāo)網(wǎng)頁(yè)出現(xiàn)在電腦屏幕上),這個(gè)事件就算徹底結(jié)束。
nginx用這個(gè)方法是底下的worker進(jìn)程搶注用戶的要求,同時(shí)搭配“異步非阻塞”的方式,實(shí)現(xiàn)高并發(fā)量。
注:在nginx.conf里第二行就是work_process,有默認(rèn)是4的,也可以更改成auto,這個(gè)值不是越大越好,要可實(shí)際情況而定。
二、負(fù)載均衡
隨著業(yè)務(wù)不斷拓展、用戶量不斷增多,原本一臺(tái)Nginx代理的服務(wù)器已經(jīng)顯得吃力,不論在性能、響應(yīng)速度等都顯得力不從心,所以需要對(duì)后臺(tái)服務(wù)器做負(fù)載均衡,緩解一臺(tái)或幾臺(tái)服務(wù)器的高并發(fā)請(qǐng)求壓力。
1、Upstream
負(fù)載均衡需要使用Nginx支持的HTTP Upstream模塊,該模塊通過(guò)一個(gè)簡(jiǎn)單的算法調(diào)度來(lái)實(shí)現(xiàn)客戶端ip到服務(wù)端負(fù)載均衡。Upstream目前支持4種調(diào)度算法:
A、默認(rèn)的輪循
默認(rèn)的調(diào)度算法,在處理客戶端的每次請(qǐng)求時(shí),按照時(shí)間順序逐一分配到均衡服務(wù)器,可以設(shè)定服務(wù)器的權(quán)重(weight)比值,比值越大訪問(wèn)的幾率越大,一般用在后臺(tái)服務(wù)器列表訪問(wèn)性能不均勻情況。
B、ip_hash
記錄每次訪客的ip地址,固定分配給指定的服務(wù)器,有效的解決了不同服務(wù)器網(wǎng)頁(yè)Session的問(wèn)題。
C、fair
根據(jù)后端服務(wù)器響應(yīng)的時(shí)間長(zhǎng)短來(lái)分配,響應(yīng)時(shí)間越短被分配幾率越大,它屬于第三方插件,Nginx本身并不支持,如需使用必須下載Nginx的upstream_fair模塊。
D、url_hash
按訪問(wèn)的地址url的hash值結(jié)果分配, 使每個(gè)url定向到指定的服務(wù)器,可以提高后端服務(wù)器的緩存效率,同樣的,Nginx本身也不支持該算法,需要第三方的hash軟件。
2、Upstream支持的狀態(tài)參數(shù)
在Nginx的Upstream模塊中,除了可以通過(guò)server指定到特定服務(wù)器和端口,還可以設(shè)置服務(wù)器在負(fù)載均衡中的狀態(tài)。目前的狀態(tài)如下:
A、down
代表當(dāng)前的服務(wù)器server不參與負(fù)載均衡。
B、backup
預(yù)留的備用設(shè)備,也就是當(dāng)其它的服務(wù)器故障或忙時(shí)才會(huì)分配它給客戶請(qǐng)求,所以它的壓力最小。
C、max_fails
服務(wù)器server允許請(qǐng)求失敗的次數(shù),默認(rèn)為1次,當(dāng)失敗次數(shù)超過(guò)限定的次數(shù),就會(huì)返回proxy_next_upstream錯(cuò)誤信息。
D、fail_timeout
當(dāng)經(jīng)歷了max_fails的次數(shù)后,暫停服務(wù)的時(shí)間,一般與max_fails配合使用。
注意:
當(dāng)服務(wù)器的調(diào)度算法為ip_hash時(shí),服務(wù)器在負(fù)載均衡中的狀態(tài)不能是weight和backup,理由很明顯,不做說(shuō)明。
3、Nginx配置負(fù)載
Nginx中配置負(fù)載均衡比較簡(jiǎn)單,只需要修改nginx.conf配置文件,添加均衡服務(wù)器列表,以及使用proxy_pass引用服務(wù)器列表即可,具體如下:
A、upstream
#upstream
upstream webservers {
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=1;
}
注:
該配置放在http{}內(nèi),server{}之外,否則會(huì)報(bào)錯(cuò)。
B、proxy_pass
location / {
proxy_pass http://webservers;
proxy_set_header X-Real-IP$remote_addr;
}
注:
引用均衡服務(wù)器的列表
C、測(cè)試均衡
瀏覽器輸入:http://127.0.0.1 反復(fù)刷新頁(yè)面,如果看到test1和test2服務(wù)端交替出現(xiàn),那么說(shuō)明負(fù)載已經(jīng)成功(如果其中一臺(tái)服務(wù)器掛掉,如test1掛掉,那么只會(huì)給test2服務(wù)器分配),測(cè)試結(jié)果如下:
4、Nginx的健康狀態(tài)檢查
配置upstream狀態(tài)max_fails和fail_timeout,對(duì)Nginx健康檢查。
A、upstream
#upstream
upstream webservers {
server 127.0.0.1:8080 weight=1max_fails=2 fail_timeout=2;
server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=2;
}
B、測(cè)試
這里的結(jié)果與上面的測(cè)試結(jié)果是一樣的,這是添加了max_fails和fail_timeout。
5、配置backup服務(wù)器
這里需要添加一臺(tái)backup虛擬機(jī)服務(wù)器,具體這里不介紹。服務(wù)器地址為:
http://backup.cwteam.com 端口:8082 內(nèi)容:Error is now,please check theerror.log
A、upstream
#upstream
upstream webservers {
server 127.0.0.1:8080 weight=1max_fails=2 fail_timeout=2;
server 127.0.0.1:8081 weight=1max_fails=2 fail_timeout=2;
server 127.0.0.1:8082 backup;
}
B、測(cè)試
為了模擬在test1和test2服務(wù)器都不工作,這里我將test1和test2的虛擬機(jī)配置文件.conf中的監(jiān)聽(tīng)端口分別改為:8084和8085,然后記得重啟Nginx服務(wù),這樣在服務(wù)器列表中的test1和test2就不能正常工作。
輸入:http://127.0.0.1 反復(fù)刷新,結(jié)果顯示:
上圖,說(shuō)明了在test1和test2都?jí)牡糁?,backup算法的服務(wù)器就會(huì)被訪問(wèn)了,下面來(lái)繼續(xù)總結(jié)ip_hash算法。
6、配置ip_hash服務(wù)器
配置ip_hash算法調(diào)度服務(wù)器時(shí),不能設(shè)置服務(wù)器的狀態(tài)為weight和backup,所以需要關(guān)閉Nginx.conf中的backup狀態(tài)服務(wù)器,配置完成記得重啟nginx,如下:
A、upstream
#upstream
upstream webservers {
ip_hash;
server 127.0.0.1:8080 weight=1max_fails=2 fail_timeout=2;
server 127.0.0.1:8081 weight=1max_fails=2 fail_timeout=2;
#server 127.0.0.1:8082 backup;
}
B、測(cè)試
輸入:http://127.0.0.1 反復(fù)刷新頁(yè)面 如果調(diào)度的服務(wù)器總是test1或是test2時(shí),那就說(shuō)明ip_hash算法服務(wù)器設(shè)置成功,結(jié)果如下:
7、統(tǒng)計(jì)Web鏈接的次數(shù)
$ netstat -an | grep :8080 | wc -l
12
注意:
使用虛擬主機(jī)驗(yàn)證Nginx反向代理及負(fù)載均衡是有限制的,正常應(yīng)該是為每個(gè)服務(wù)器配置web服務(wù)器,所以對(duì)應(yīng)的均衡服務(wù)器配置驗(yàn)證時(shí),因該以關(guān)閉web服務(wù)器為準(zhǔn),而且在對(duì)應(yīng)的服務(wù)器中可以查看日志信息。
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。