ngx_http_upstream_hc_module 模組
範例設定 指令 health_check match |
ngx_http_upstream_hc_module
模組允許啟用在周圍位置引用的群組中伺服器的定期健康檢查。伺服器群組必須位於共享記憶體中。
如果健康檢查失敗,伺服器將被視為不健康。如果為同一伺服器群組定義了多個健康檢查,則任何一個檢查的單次失敗都會使相應的伺服器被視為不健康。用戶端請求不會傳遞給不健康的伺服器以及處於「檢查中」狀態的伺服器。
請注意,大多數變數在與健康檢查一起使用時將具有空值。
此模組可作為我們的商業訂閱的一部分提供。
範例設定
upstream dynamic { zone upstream_dynamic 64k; server backend1.example.com weight=5; server backend2.example.com:8080 fail_timeout=5s slow_start=30s; server 192.0.2.1 max_fails=3; server backup1.example.com:8080 backup; server backup2.example.com:8080 backup; } server { location / { proxy_pass http://dynamic; health_check; } }
透過此設定,nginx 將每五秒向 backend
群組中的每個伺服器發送「/
」請求。如果發生任何通訊錯誤或逾時,或者代理伺服器回應的狀態碼不是 2xx 或 3xx,則健康檢查將失敗,並且該伺服器將被視為不健康。
可以設定健康檢查以測試回應的狀態碼、是否存在某些標頭欄位及其值,以及主體內容。測試使用 match 指令單獨設定,並在 health_check 指令的 match
參數中引用。
http { server { ... location / { proxy_pass http://backend; health_check match=welcome; } } match welcome { status 200; header Content-Type = text/html; body ~ "Welcome to nginx!"; } }
此設定顯示,為了使健康檢查通過,對健康檢查請求的回應應成功、狀態為 200,並且在主體中包含「Welcome to nginx!
」。
指令
語法 |
health_check [ |
---|---|
預設 | — |
上下文 |
location |
啟用在周圍位置引用的群組中伺服器的定期健康檢查。
支援以下可選參數
-
interval
=time
- 設定兩個連續健康檢查之間的時間間隔,預設為 5 秒。
-
jitter
=time
- 設定每個健康檢查將隨機延遲的時間,預設情況下沒有延遲。
-
fails
=number
- 設定特定伺服器連續健康檢查失敗的次數,在此次數之後,該伺服器將被視為不健康,預設為 1。
-
passes
=number
- 設定特定伺服器連續健康檢查通過的次數,在此次數之後,該伺服器將被視為健康,預設為 1。
-
uri
=uri
- 定義在健康檢查請求中使用的 URI,預設為「
/
」。 -
mandatory
[persistent
] -
設定伺服器的初始「檢查中」狀態,直到第一個健康檢查完成 (1.11.7)。用戶端請求不會傳遞給處於「檢查中」狀態的伺服器。如果未指定參數,則伺服器最初將被視為健康。
如果伺服器在重新載入之前被視為健康,則
persistent
參數 (1.19.7) 會在重新載入後設定伺服器的初始「正常運作」狀態。 -
match
=name
- 指定
match
區塊,用於設定回應應通過的測試,以便健康檢查通過。預設情況下,回應應具有 2xx 或 3xx 狀態碼。 -
port
=number
- 定義連線至伺服器以執行健康檢查時使用的連接埠 (1.9.7)。預設情況下,等於伺服器連接埠。
-
type
=grpc
[grpc_service
=name
] [grpc_status
=code
] - 啟用 gRPC 伺服器的定期健康檢查,或使用可選的
grpc_service
參數指定的特定 gRPC 服務 (1.19.5)。如果伺服器不支援 gRPC 健康檢查協定,則可以使用可選的grpc_status
參數來指定將被視為健康的非零 gRPC 狀態 (例如,狀態碼「12
」/「UNIMPLEMENTED
」)health_check mandatory type=grpc grpc_status=12;
type
=grpc
參數必須在所有其他指令參數之後指定,grpc_service
和grpc_status
必須跟在type
=grpc
之後。該參數與uri
或match
參數不相容。 -
keepalive_time
=time
- 啟用健康檢查的keepalive連線,並指定可透過一個 keepalive 連線處理請求的時間 (1.21.7)。預設情況下,停用 keepalive 連線。
語法 |
match |
---|---|
預設 | — |
上下文 |
http |
定義用於驗證健康檢查請求回應的命名測試集。
可以在回應中測試以下項目
status 200;
- 狀態為 200
status ! 500;
- 狀態不是 500
status 200 204;
- 狀態為 200 或 204
status ! 301 302;
- 狀態既不是 301 也不是 302
status 200-399;
- 狀態在 200 到 399 的範圍內
status ! 400-599;
- 狀態不在 400 到 599 的範圍內
status 301-303 307;
- 狀態為 301、302、303 或 307
header Content-Type = text/html;
- 標頭包含值為
text/html
的「Content-Type」 header Content-Type != text/html;
- 標頭包含值不是
text/html
的「Content-Type」 header Connection ~ close;
- 標頭包含值與正規表示式
close
相符的「Connection」 header Connection !~ close;
- 標頭包含值與正規表示式
close
不符的「Connection」 header Host;
- 標頭包含「Host」
header ! X-Accel-Redirect;
- 標頭缺少「X-Accel-Redirect」
body ~ "Welcome to nginx!";
- 主體與正規表示式「
Welcome to nginx!
」相符 body !~ "Welcome to nginx!";
- 主體與正規表示式「
Welcome to nginx!
」不符
require
$variable
...;
- 所有指定的變數都不為空且不等於「0」(1.15.9)。
如果指定了多個測試,則只有在與所有測試都相符時,回應才相符。
僅檢查回應主體的前 256k。
範例
# status is 200, content type is "text/html", # and body contains "Welcome to nginx!" match welcome { status 200; header Content-Type = text/html; body ~ "Welcome to nginx!"; }
# status is not one of 301, 302, 303, or 307, and header does not have "Refresh:" match not_redirect { status ! 301-303 307; header ! Refresh; }
# status ok and not in maintenance mode match server_ok { status 200-399; body !~ "maintenance mode"; }
# status is 200 or 204 map $upstream_status $good_status { 200 1; 204 1; } match server_ok { require $good_status; }