使用Nginx負(fù)載均衡搭建高性能.NETweb應(yīng)用程序一
來(lái)源:程序員人生 發(fā)布時(shí)間:2015-01-04 08:54:19 閱讀次數(shù):3559次
1、遇到的問(wèn)題
當(dāng)我們用IIS服務(wù)器部署了1個(gè)web利用以后,當(dāng)很多用戶高并發(fā)訪問(wèn)的時(shí)候,客戶端響應(yīng)就會(huì)很慢,客戶的體驗(yàn)就會(huì)很差,由于IIS接遭到客戶端要求的時(shí)候,就會(huì)創(chuàng)建1個(gè)線程,當(dāng)線程到達(dá)幾千個(gè)時(shí)候,這些線程就會(huì)占用較大內(nèi)存,同時(shí)由于這些線程要進(jìn)行切換,所以CPU占用也會(huì)比較高,這樣IIS性能就很難提高了。那末如何解決這個(gè)問(wèn)題呢?
2、如何解決高并提問(wèn)題
為了解決這個(gè)高并發(fā)的問(wèn)題,我們就需要進(jìn)行負(fù)載均衡。我們可以在架構(gòu)上通過(guò)硬件和軟件來(lái)解決負(fù)載均衡,硬件層面可使用負(fù)載均衡器,1般而言,硬件負(fù)載均衡在功能、性能上優(yōu)于軟件方式,不過(guò)本錢昂貴,常見(jiàn)的硬件負(fù)載均衡有F5,A10等品牌,這些硬件負(fù)載均衡在大型公司都被經(jīng)常使用,另外一方面,我們要從軟件層面進(jìn)行負(fù)載均衡,經(jīng)常使用LVS,Ngnix等負(fù)載均衡服務(wù)器。
3、Ngnix是甚么?
Nginx是1個(gè)高性能的HTTP和反向代理服務(wù)器,也是1個(gè)IMAP/POP3/SMTP代理服務(wù)器,那末甚么是反向代理服務(wù)器呢?在服務(wù)器段接受客戶真?zhèn)€要求,然后把要求分發(fā)給具體的服務(wù)器處理,然后再將其服務(wù)器的響應(yīng)反饋結(jié)果發(fā)給客戶端,例如當(dāng)用戶在地址欄輸入:www.baidu.com,這時(shí)候候閱讀器會(huì)構(gòu)建1個(gè)要求報(bào)文要求發(fā)送給Nginx服務(wù)器,然后Nginx把所有的要求發(fā)送給我們的IIS服務(wù)器,IIS服務(wù)器處理后把結(jié)果發(fā)送給Nginx,Nginx服務(wù)器將最后的結(jié)果發(fā)送給客戶端閱讀器。代理服務(wù)器相當(dāng)于網(wǎng)絡(luò)的中間實(shí)體,代理服務(wù)器既是web服務(wù)器,又是web客戶端。因此引出1個(gè)名詞:正向代理服務(wù)器,正向代理服務(wù)器是為了從原始服務(wù)器獲得內(nèi)容,客戶端向代理服務(wù)器發(fā)送1個(gè)要求,并指定原始服務(wù)器的IP和端口,然后代理服務(wù)器向原始服務(wù)器專家要求并獲得內(nèi)容,并將結(jié)果反饋給客戶端,因此客戶端需要進(jìn)行設(shè)置才能使用正向代理。下圖所示。

4、Nginx 優(yōu)點(diǎn):
跨平臺(tái):Linux,Unix,也有windows的移植版本,固然在Linux上部署肯定是最好的,但是我們可以在windows上使用其移植版本。
配置異常簡(jiǎn)單
非阻塞,高并發(fā)連接,官方測(cè)試能夠支持5萬(wàn)并發(fā),
事件驅(qū)動(dòng):通訊機(jī)制采取epoll,當(dāng)事件沒(méi)有轉(zhuǎn)備好時(shí),就放入隊(duì)列中,準(zhǔn)備好了才去處理。
master/worker結(jié)構(gòu):1個(gè)master進(jìn)程來(lái)管理多個(gè)worker進(jìn)程,和Arcig的SOM,SOC結(jié)構(gòu)類似,當(dāng)Ngnix啟動(dòng),就會(huì)根據(jù)我們配置的信息,1般我設(shè)置與機(jī)器cpu核1致,啟動(dòng)其woker進(jìn)程,每一個(gè)worker之間是對(duì)等關(guān)系,即他們都能夠處理客戶端來(lái)發(fā)的要求,所以這就觸及到1個(gè)鎖問(wèn)題,同時(shí)我們可以用不用暫停系統(tǒng),直接修改了配置文件后,可以重啟Nginx,緣由是由于master接遭到命令
reload以后,就會(huì)重新加載配置文件,然后啟動(dòng)新的進(jìn)程,并告知所有的老的worker,處理完所有的要求后就退出。另外,我們可以體會(huì)下這類模型的有點(diǎn),就是當(dāng)1個(gè)woker出現(xiàn)問(wèn)題退出了,不會(huì)造成系統(tǒng)沒(méi)法使用,其他的還是可以正常使用。
內(nèi)存消耗少:處理大并發(fā)要求內(nèi)存消耗少,在3wan并發(fā)連接下,10個(gè)進(jìn)程才消耗150M內(nèi)存。
內(nèi)置監(jiān)控檢查功能:當(dāng)后臺(tái)某個(gè)web服務(wù)器宕機(jī)(掛了)時(shí)候,不影響前端訪問(wèn)。它是通過(guò)后臺(tái)服務(wù)器反饋的狀態(tài)碼(500,404之類的來(lái)判斷的)
節(jié)省帶寬:支持GZIP緊縮。
穩(wěn)定性高
5、Ngnix如何處理1個(gè)要求?
當(dāng)Nginx啟動(dòng)時(shí),先會(huì)解析我們配置的文件,得到監(jiān)聽(tīng)的端口和Ip地址,master進(jìn)程就會(huì)初始化這個(gè)建庫(kù)的socket通訊,然后再fork,master調(diào)用fork函數(shù)創(chuàng)建1個(gè)新的進(jìn)程,由fork創(chuàng)建的新進(jìn)程被稱為子進(jìn)程,然后這些worker會(huì)競(jìng)爭(zhēng)去接受的新的連接,此時(shí)客戶端就能夠向Nginx發(fā)起連接了,當(dāng)客戶端與Nginx進(jìn)行3次握手,與Nginx建立了1個(gè)連接后,此時(shí)1個(gè)子進(jìn)程worker會(huì)連接成功,然后得到這個(gè)建立好的連接socket,然后Nginx對(duì)連接的封裝,讀寫處理,最后,Nginx主動(dòng)關(guān)閉連接。
Nginx在實(shí)現(xiàn)時(shí),是通過(guò)1個(gè)連接池來(lái)管理的,每一個(gè)worker進(jìn)程都有1個(gè)獨(dú)立的連接池,連接池的大小是worker_connections。這里的連接池里面保存的其實(shí)不是真實(shí)的連接,它只是1個(gè)worker_connections大小的1個(gè)ngx_connection_t結(jié)構(gòu)的數(shù)組。并且,nginx會(huì)通過(guò)1個(gè)鏈表free_connections來(lái)保存所有的空閑ngx_connection_t,每次獲得1個(gè)連接時(shí),就從空閑連接鏈表中獲得1個(gè),用完后,再放回空閑連接鏈表里面。 這個(gè)值是表示每一個(gè)worker進(jìn)程所能建立連接的最大值,所以,1個(gè)nginx能建立的最大連接數(shù),應(yīng)當(dāng)是worker_connections
* worker_processes。由于反向服務(wù)器要占用2個(gè)連接,最大并發(fā)數(shù)量應(yīng)當(dāng)是worker_connections * worker_processes/2。
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)