在Nginx負載均衡中,我們很難保證說每一台應用服務器都能一直正常的運行下去。但是我們可以通過設置Nginx來檢測這些應用服務器,檢測這些服務器當中不能訪問的。
Nginx的檢測方式分為兩種,一種是被動監測,另一種是主動監測。下面我們分別看一下這兩種方式。
被動監測
當Nginx認為一台應用服務器不能被訪問的時候,它會暫時停止向這台應用上面分發請求。直到Nginx認為該應用服務器可以再次被訪問的時候才會再向這台應用服務器上面分發請求。
要實現對應用服務器的監測,需要通過兩個參數來幫助。
fail_timeout——該參數表示停止分發請求至該應用服務器的時間。也就是說,如果Nginx認為一台應用服務器不能被訪問了,則Nginx就會停止向這台應用服務器上分發請求。那需要多長時間Nginx才會認為該服務器可以被訪問從而向其分發請求呢。這就需要通過該參數來設置這個時間了。
max_fails——設置訪問失敗的最大次數。當Nginx向一台服務器分發請求,如果失敗的次數達到該參數設置的數量,則Nginx認為該應用服務器不能訪問。在接下來的請求就不會再發給該應用服務器。直到達到fail_timeout設置的時間才會再次向這台應用分發請求。
例一
http {
upstream onmpw {
server 192.168.144.128;
server 192.168.144.132 max_fails=3 fail_timeout=30s;
server 192.168.144.131 max_fails=2;
}
server {
listen 80;
location / {
proxy_pass http://onmpw;
}
}
}
對於fail_timeout和max_fails的默認值分別為10s和1次。也就是說,當Nginx向一台應用服務器發送請求,如果失敗則認為該應用服務器不可訪問。接下來的10s中請求不再分發給該應用服務器。直到10s以后會再次將請求分發給該應用服務器。
對於例一,我們看到對於132應用,當請求失敗次數達到3次。Nginx會在30s內不再向該應用分發請求。直到30s以后會再次分發新的請求到該應用服務器上。對於131應用,當請求次數達到2次,Nginx就會在10s內(因為沒有設置fail_timeout,所以默認為10s)不再向這台應用發送請求。
這種方式需要我們在每台應用服務器對應的信息后面設置,所以稱其為被動監測。
主動監測
由Nginx定期的向每台應用服務器發送特殊的請求,來監測應用服務器是否可以正常訪問。這種方式稱為主動監測。
為了實現主動監測這種方式,我們需要在Nginx負載均衡的配置文件中加入health_check指令。除此之外,我們還需要在設置應用服務器信息的組里加入zone指令。
例二
http {
upstream onmpw {
zone onmpw 64k;
server 192.168.144.128;
server 192.168.144.132;
server 192.168.144.131;
}
server {
listen 80;
location / {
proxy_pass http://onmpw;
health_check;
}
}
}
在這里我們設置了一組應用服務器。通過一個單一的location,將所有的請求都分發到這組應用服務器上。在這種情況下,每隔5s Nginx Plus就會向每一台應用服務器發送’/’請求。任何一台應用服務器連接錯誤或者響應超時亦或者是被代理的服務器響應了一個狀態碼2xx或者是3xx,health_check機制就會認為是失敗的。對於任何一台應用服務器,如果health_check失敗,則就會被認為是不穩定的。那么Nginx Plus就不再向這台應用服務器分發訪問請求。
zone指令定義了一塊兒內存空間。這塊兒空間存儲在各個工作進程中共享的運行環境的狀態和應用服務器組的配置信息。這塊兒空間應該根據實際情況盡量申請的大一些,要保證能存下這些信息。
下面我們再看這樣的一個例子
例三
location / {
proxy_pass http://onmpw;
health_check interval=10 fails=3 passes=2;
}
在上面的例三中,interval=10表示兩次進行health_check的間隔為10s,如果不設置默認兩次的間隔是5s。fails=3表示一台應用服務器如果請求失敗次數達到3次,則該應用服務器被認為不能訪問。最后是passes=2表示,被認定為不能訪問的服務器需要再次進行兩次health_check 以后才會再次被認為是可以正常訪問的。
在health_check中,我們可以指定請求的url。
例四
location / {
proxy_pass http://onmpw;
health_check uri=/some/path;
}
對於onmpw組中的第一台應用服務器128來說,一次health check請求的url是http://192.168.144.128/some/path。
上面兩種監測方式是普遍被使用的,希望本文對大家有所幫助。