Windows下Nginx官方版仅支持被动健康检查,需通过第三方模块(如nginx_upstream_check_module)或外部脚本实现主动检查;被动检查依赖请求失败自动标记节点,存在响应滞后性。
Windows 下 Nginx 本身不原生支持
的主动健康检查(active health check),官方开源版仅提供被动检查(passive health check)。若需主动探测后端服务状态,需借助第三方模块或外部工具实现。
被动健康检查(内置支持)
这是 Nginx 开源版默认且唯一原生支持的方式,依赖请求失败时的响应行为自动标记/恢复节点。
原理
:当某台后端服务器返回错误(如 500、502、503、504)、超时或无法连接时,Nginx 将其标记为“不可用”,并在
时间内不再转发请求;之后按
和
规则尝试恢复。
典型配置示例
:
关键参数说明
:
:连续失败 3 次即标记为不可用
:30 秒内不发请求,并在 30 秒后尝试恢复(第一次试探性请求成功即恢复)
未显式设置时,默认
,
注意
:被动检查无法提前发现“活着但已卡死/无响应”的后端,只能等真实请求失败后才反应,存在滞后性。
主动健康检查(需扩展)
Windows 下想实现定时探测后端 HTTP 状态(如每 5 秒 GET /health),必须引入第三方模块,最常用的是
nginx_upstream_check_module
(由淘宝系维护)。
前提条件
:
需自行编译 Nginx(Windows 官方二进制包不含该模块)
推荐使用 MSYS2 + MinGW-w64 编译环境,或改用 WSL2 中编译后复制到 Windows 运行(更稳定)
注意:该模块不支持 Windows 原生 event 模型(如 iocp),建议用
或
模式
启用后的配置示例
:
参数含义
:
:每 5 秒探测一次
:连续 2 次成功则恢复服务
:连续 3 次失败则标记下线
:每次探测超时时间为 3 秒
:执行 HTTP 探测(还支持 tcp、ssl_hello)
:发送的探测请求内容
:期望返回哪些状态码视为健康
查看检查状态
:需配合
指令暴露监控页(需放在 location 中)
替代方案:轻量级外部健康检查
若编译复杂或稳定性要求高,可在 Windows 上用简单脚本+计划任务模拟主动检查,再动态更新 upstream 配置并重载 Nginx。
思路
:用 PowerShell 或 Python 定期调用后端
接口,根据结果生成新的
配置片段,写入临时文件,再执行
。
优点
:不依赖编译,完全可控,适配任意探测逻辑(如 DB 连通性、磁盘空间等)
注意点
:
确保 Nginx 配置中 upstream 使用
引入动态文件(如
)
重载前校验配置语法:
,避免 reload 失败导致服务中断
建议加锁或串行执行,防止多实例并发写入冲突
小结与建议
Windows 下 Nginx 健康检查能力受限于官方功能边界。生产环境若强依赖主动探测,推荐以下路径:
开发/测试阶段:优先用被动检查 + 合理调优
/
,足够应对多数场景
需要主动探测:评估是否值得投入编译维护成本;否则倾向采用外部脚本+reload 方案,更灵活可靠
长期规划:考虑迁移到支持原生主动检查的替代品,如 OpenResty(已集成 lua-resty-upstream-healthcheck)、Traefik 或 Envoy
upstreamfail_timeoutmax_failsfail_timeout
upstream backend {
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
}
max_fails=3fail_timeout=30smax_fails=1fail_timeout=10sselectpoll
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
check interval=5 rise=2 fall=3 timeout=3 type=http;
check_http_send "GET /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
interval=5rise=2fall=3timeout=3type=httpcheck_http_sendcheck_http_expect_alivecheck_status/healthupstreamnginx -s reloadincludeinclude upstream_backend.conf;nginx -tmax_failsfail_timeout