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