Nginx需通过upstream块配置max_fails和fail_timeout实现被动健康检查,proxy_pass仅转发不感知状态;停用后端后日志应出现“temporarily disabled”提示,且流量自动切至其他节点。

要验证 Nginx 的 proxy_pass 在后端节点故障时是否能自动剔除(即临时标记为不可用并跳过),关键不在于 proxy_pass 本身——它只是转发指令,真正负责健康检测与节点摘除的是 upstream 模块 + 健康检查机制。Nginx 开源版默认不支持主动健康检查(active health check),需依赖被动检测(fail_timeout / max_fails)配合 upstream 状态管理;而 Nginx Plus 或 OpenResty 才内置主动探测能力。
确认使用了 upstream 块而非直写 proxy_pass 地址
直接在 location 中写 proxy_pass http://192.168.1.10:8080 不会触发任何节点剔除逻辑——这属于静态转发,无容错机制。必须通过命名 upstream 块定义后端集群:
upstream backend {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
}
location / {
proxy_pass http://backend;
}
其中 max_fails 表示连续失败多少次后标记为不可用,fail_timeout 是该标记的持续时间(期间请求不再发给该节点)。
模拟后端故障并观察 Nginx 日志与行为
按以下步骤实测:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- 停掉其中一台后端服务(如
systemctl stop myapp或直接 kill 进程) - 用 curl 或 ab 工具持续发起请求(例如
while true; do curl -sI http://nginx-host/ | head -1; sleep 1; done) - 检查 Nginx error log(通常位于
/var/log/nginx/error.log),应看到类似记录:upstream server temporarily disabled while connecting to upstream - 观察响应是否稳定由另一台正常节点返回(可用
curl -v看 Server 头或日志中 upstream_addr 字段)
验证节点恢复后是否自动重新加入
等 fail_timeout 时间过后(比如设为 30s,则等待 ≥30 秒),再启动刚才停掉的后端服务。之后继续发请求,注意:
- Nginx 不会立即重试已禁用节点,但下一次请求调度时会尝试连接
- upstream server restored 类提示(需开启 debug 日志或依赖第三方模块)
增强可观测性(可选进阶)
若需更清晰验证状态变化,可:
- 启用
log_format记录$upstream_addr和$upstream_status,确认请求实际打到了哪个地址及返回码 - 使用
stub_status模块(需编译时启用)查看当前 upstream 连接统计(但不显示单节点状态) - 升级到 Nginx Plus 或使用 nginx_upstream_check_module(开源第三方模块),支持主动健康检查和 /status 接口实时查看节点状态










