被動檢查
對于被動健康檢查,nginx 和 nginx plus 會在事件發生時對其進行監控,并嘗試恢復失敗的連接。如果仍然無法恢復正常,nginx 開源版和 nginx plus 會將服務器標記為不可用,并暫時停止向其發送請求,直到它再次標記為活動狀態。
上游服務器標記為不可用的條件是為每個上游服務器定義的,其中包含塊中 server 指令的參數 upstream:
-
fail_timeout – 設置服務器標記為不可用時必須進行多次失敗嘗試的時間,以及服務器標記為不可用的時間(默認為 10 秒)。
-
max_fails – 設置在 fail_timeout 服務器標記為不可用期間必須發生的失敗嘗試次數(默認為 1 次嘗試)。 在以下示例中,如果 nginx 未能在 30 秒內向服務器發送請求或未收到響應 3 次,則表示服務器在 30 秒內不可用:
upstream?backend?{ ??server?backend1.example.com; ??server?backend2.example.com?max_fails=3?fail_timeout=30s; }
需要注意的是如果只有一個單一的服務器組中,將 fail_timeout 和 max_fails 參數被忽略,服務器永遠不會標記為不可用。
服務器慢啟動
最近恢復的服務器很容易被連接淹沒,這可能導致服務器再次被標記為不可用。慢啟動允許上游服務器在恢復或變得可用之后逐漸將其權重從零恢復到其標稱值。這可以指定 upstream 的 server 模塊的 slow_start 參數來完成:
upstream?backend?{ ??server?backend1.example.com?slow_start=30s; ??server?backend2.example.com; ??server?192.0.0.1?backup; }
注意:如果組中只有一臺服務器,則 slow_start 參數將被忽略,而服務器永遠不會被標記位不可用狀態。慢啟動是 nginx plus 的專有功能
nginx plus的主動檢查
nginx plus 可以通過向每個服務器發送特殊的健康檢查請求并驗證正確的響應來定期檢查上游服務器的運行狀況。
要啟用活動運行狀況檢查:
1.在 location 區塊將 requests(proxy_pass)傳遞給上游組的過程中,包含 health_check 指令:
server?{ ?location?/?{ ???proxy_pass?http://backend; ???health_check; ?} }
此代碼段定義了一個服務器,它將所有請求匹配到 location / 傳遞給調用的上游組 backend。它還使用該 health_check 指令啟用高級運行狀況監視:默認情況下,nginx plus 每五秒向組中的每個服務器發送一個 “/” 請求 backend。
如果任何通信錯誤或發生超時(在服務器返回的狀態碼超出 200- 399的范圍)的健康檢查失敗。服務器被標記為不健康,并且 nginx plus 在再次通過運行狀況檢查之前不會向其發送客戶端請求。
另一個可選項:您可以指定另一個用于運行狀況檢查的端口,例如,用于監視同一主機上的許多服務的運行狀況。使用指令的 port 參數指定新端口 health_check:
server?{ ?location?/?{ ???proxy_pass??http://backend; ???health_check?port=8080; ?} }
2.在上游服務器組,使用 zone 指令定義一個共享內存區域:
http?{ ?upstream?backend?{ ???zone?backend?64k; ???server?backend1.example.com; ???server?backend2.example.com; ???server?backend3.example.com; ???server?backend4.example.com; ?} }
該區域在所有工作進程之間共享,并存儲上游組的配置。這使工作進程能夠使用同一組計數器來跟蹤組中服務器的響應。
可以使用 health_check 指令的參數覆蓋活動運行狀況檢查的默認值:
location?/?{ ??proxy_pass?http://backend; ??health_check?interval=10?fails=3?passes=2; }
此處,該 interval 參數將運行狀況檢查之間的延遲從默認的 5 秒增加到 10 秒。該 fails 參數要求服務器三次運行狀況檢查失敗時,以將其標記為運行狀況不佳(從默認值開始)。最后,passes 參數意味著服務器必須通過兩次連續檢查才能再次標記為健康,而不是默認值。
指定請求的url
在 health_check 指令中指定 uri 參數來設置健康檢查請求的路由:
location?/?{ ??proxy_pass?http://backend; ??health_check?uri=/some/path; }
指定的 uri 將附加到為 upstream 塊中的服務器設置的服務器域名或ip地址。對于backend 上面聲明的樣本組中的第一個服務器,運行狀況檢查會請求uri http://backend1.example.com/some/path。
定義自定義條件
您可以設置響應必須滿足的自定義條件,以便服務器通過運行狀況檢查。條件在match塊中定義,該塊match在health_check指令的參數中引用。
1.在 http {} 級別,指定 match {} 塊并為其命名,例如:’server_ok’
http?{ ?#...? ?match?server_ok?{ ???#?tests?are?here????? ?} }
2.health_check 通過指定塊的 match 參數和 match 參數塊的名稱:
http?{ ?#...? ?match?server_ok?{ ???status?200-399; ???body?!~?"maintenance?mode"; ?} ?server?{ ???#...????? ???location?/?{ ?????proxy_pass?http://backend; ?????health_check?match=server_ok; ???} ?} }
如果響應的狀態代碼在范圍中,則傳遞運行狀況檢查 200- 399 并且其正文不包含字符串: ‘maintenance mode’
該 match 指令使 nginx plus 能夠檢查狀態代碼,標題字段和響應正文。使用此指令可以驗證狀態是否在指定范圍內,響應是否包含標頭,或者標頭或正文是否與正則表達式匹配。該 match 指令可以包含一個狀態條件,一個正文條件和多個標題條件。響應必須滿足 match 塊中定義的所有條件,以便服務器通過運行狀況檢查。
例如,下面的 match 指令匹配有狀態代碼響應 200,精確值 text/html 的content-type 標題,頁面中的文字:’welcome to nginx!’.
match?welcome?{ ??status?200; ??header?content-type?=?text/html; ??body?~?"welcome?to?nginx!"; }
以下示例使用感嘆號(!)來定義響應不得通過運行狀況檢查的特征。在這種情況下,健康檢查在非 301,302,303,或 307狀態碼,同時并沒有 refresh 頭信息時將通過檢查,。
match?not_redirect?{ ??status?!?301-303?307; ??header?!?refresh; }
健康檢查可以在其他非 http 協議中啟用, 例如 fastcgi, , scgi, ?甚至 tcp 和 udp。
很多很好的特性,就是需要 nginx plus 才能使用。