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

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