健康检查机制
Nginx 通过主动/被动健康检查实现后端服务器状态监控,自动摘除故障节点,保障服务高可用。
被动健康检查
内置机制
nginx
upstream backend {
server 10.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 10.0.0.2:8080 max_fails=3 fail_timeout=30s;
server 10.0.0.3:8080 backup;
server 10.0.0.4:8080 down;
}
核心参数
| 参数 | 说明 |
|---|---|
| max_fails | 最大失败次数,超过后标记为不可用 |
| fail_timeout | 失败时间窗口 + 不可用时长 |
| backup | 备用服务器,仅当主服务器不可用时使用 |
| down | 永久标记不可用(用于维护) |
失败判定条件
- 连接超时
- 连接拒绝
- HTTP 5xx 响应码(需 proxy_next_upstream)
nginx
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
被动检查仅在实际请求时触发,无法主动发现未承载流量的服务器故障。
主动健康检查
Nginx Plus 方案
nginx
upstream backend {
zone backend 64k;
server 10.0.0.1:8080;
server 10.0.0.2:8080;
health_check interval=10s fails=3 passes=2
uri=/healthz match=status_200;
}
match status_200 {
status 200;
header Content-Type = text/html;
body ~ "OK";
}
OpenResty 方案
lua
-- healthcheck.lua
local healthcheck = require("resty.upstream.healthcheck")
local ok, err = healthcheck.spawn{
name = "backend",
type = "http",
http_req = "GET /healthz HTTP/1.1\r\nHost: backend\r\n\r\n",
interval = 5000, -- 5s
timeout = 2000, -- 2s
fall = 3, -- 连续3次失败标记为 down
rise = 2, -- 连续2次成功标记为 up
valid_statuses = {200, 204},
concurrency = 10,
}
主动检查参数
| 参数 | 说明 |
|---|---|
| interval | 检查间隔,默认 5s |
| fails | 连续失败次数阈值 |
| passes | 连续成功次数阈值 |
| uri | 健康检查路径 |
| match | 响应匹配规则 |
状态监控
状态接口
nginx
# Nginx Plus API
location /api {
api write=on;
allow 127.0.0.1;
deny all;
}
# 查询健康状态
# GET /api/7/http/upstreams/backend/peers/
响应结构
JSON
{
"server": "10.0.0.1:8080",
"state": "up",
"active": 5,
"health_checks": {
"checks": 150,
"fails": 2,
"unhealthy": 0,
"last_passed": true
}
}
故障转移策略
优雅摘除
nginx
upstream backend {
server 10.0.0.1:8080 weight=5;
server 10.0.0.2:8080 weight=3;
server 10.0.0.3:8080 weight=2;
# 慢启动(新节点逐步承接流量)
server 10.0.0.4:8080 slow_start=30s;
}
强制下线
nginx
# 动态 API
# POST /api/7/http/upstreams/backend/peers/
{ "down": true }
要点总结
- 被动检查依赖实际请求,通过 max_fails/fail_timeout 标记故障节点
- 主动检查定期探测健康端点,Nginx Plus 内置,OpenResty 可通过 resty.upstream 实现
- proxy_next_upstream 定义失败重试条件,支持 error/timeout/http_5xx
- 健康状态可通过 Nginx Plus API 查询,支持动态上下线
- 慢启动参数 slow_start 避免新节点突然承接全量流量
📝 发现内容有误?点击此处直接编辑