全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-20 8 分钟 ✍️ juanwangdev

健康检查机制

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 避免新节点突然承接全量流量

📝 发现内容有误?点击此处直接编辑

← 上一篇 会话保持
下一篇 → 流量控制与限流
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库