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 [parameters];
預設
上下文 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_servicegrpc_status 必須跟在 type=grpc 之後。該參數與 urimatch 參數不相容。
keepalive_time=time
啟用健康檢查的keepalive連線,並指定可透過一個 keepalive 連線處理請求的時間 (1.21.7)。預設情況下,停用 keepalive 連線。

語法 match name { ... }
預設
上下文 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;
}