被動檢查
對於被動健康檢查,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 才能使用。
以上是Nginx http運行狀況健康檢查如何配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!