Nginx 默认不支持主动健康检查,需源码编译第三方模块 nginx_upstream_check_module;配置 check 指令实现独立心跳探测,禁用 max_fails 被动机制,并通过 check_http_send 和 check_http_expect_alive 定制 HTTP 探测行为。

开源 Nginx 默认不支持主动健康检查,必须借助第三方模块 nginx_upstream_check_module 才能实现基于 HTTP、TCP 等协议的定时探活。它和原生的 max_fails/fail_timeout 被动机制完全不同——后者靠真实请求失败才标记节点下线,而 upstream check 是独立于业务流量的“心跳探测”,能提前发现服务僵死、接口卡顿等问题。
先确认模块是否已启用
运行 nginx -V 2>&1 | grep -o 'upstream_check'。若无输出,说明模块未编译进当前 Nginx。不能通过 apt/yum 安装,只能源码编译:
- 下载与你当前 Nginx 版本完全一致的源码(如
nginx-1.28.0)和对应版本的nginx_upstream_check_module(推荐 v0.4.0) - 用匹配的补丁文件打补丁(例如 Nginx 1.28.0 选
check_1.26.1+.patch) -
configure时加入--add-module=/path/to/module,复用原有参数后执行make && make install - 重启 Nginx 并再次验证
nginx -V输出中含upstream_check
在 upstream 块中配置 check 指令
模块启用后,在 upstream 块内添加 check 指令,对整个组生效:
-
check interval=3 rise=2 fall=3 timeout=1 type=http;:每 3 秒发一次探测,连续 2 次成功恢复上线,连续 3 次失败才下线,单次超时 1 秒 - 必须显式指定
type=http(默认可能是 tcp),否则无法使用 HTTP 相关子指令 - 禁用原生被动机制干扰:每个
server行应设max_fails=0 fail_timeout=0 - 不要和
keepalive共存——二者冲突,会导致启动失败
定制 HTTP 探测行为
让探测命中真实业务健康接口(如 /health 或 /actuator/health),并校验响应内容而非仅看状态码:
- 用
check_http_send发送完整请求:check_http_send "GET /health HTTP/1.1\r\nHost: api.example.com\r\nConnection: close\r\n\r\n"; - 推荐用
GET而非HEAD,便于后端返回结构化 JSON(如{"status":"UP"}) -
check_http_expect_alive http_2xx;保留基础状态码要求,但注意:仅靠 200 不够可靠,需后端接口自身做内部检查(如 DB 连通性、磁盘空间)
暴露状态页并做好安全控制
添加专用 location 提供实时节点状态,用于人工排查或 Prometheus 采集:
location /status { check_status; access_log off; allow 127.0.0.1; deny all; }- 访问
/status可看到各节点 IP、端口、当前状态(up/down)、失败次数、最近检测时间 - 务必限制访问来源,避免敏感信息泄露;生产环境建议只允许监控系统 IP 或内网段
- 可配合
proxy_next_upstream error timeout http_502 http_504;做兜底,形成双重容错


















