nginx通过upstream模块的max_fails、fail_timeout、proxy_next_upstream及backup实现开源版故障自动转移:被动健康检查剔除异常java节点,请求重试转发至健康实例,并在全宕机时启用备用服务器。

Nginx 与 Java 应用(如 Spring Boot)配合实现负载均衡时,故障自动转移(Failover)不是靠 Java 端控制的,而是由 Nginx 的 upstream 模块通过被动健康检查 + 容错重试机制完成。只要后端 Java 服务部署在多个节点上,并正确配置 Nginx,就能在某台服务宕机、响应超时或返回错误码时,自动跳过它、重试其他节点,甚至启用备用服务器。
下面分四部分说明关键配置点,全部基于开源 Nginx(无需付费版 nginx-plus 或 OpenResty 扩展):
定义带容错参数的 upstream 组
在 http { } 块中声明 upstream,为每个 Java 后端节点设置故障判定规则:
-
max_fails=3:连续失败 3 次即标记为不可用 -
fail_timeout=30s:30 秒内达到 max_fails 才下线;超时后 Nginx 会悄悄发起试探请求,尝试恢复 - 默认只把连接拒绝、超时、500/502/503/504 当作失败(可扩展)
upstream java_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;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
}
开启请求重试与错误码转发
仅下线节点不够——当前请求必须能转给别的健康节点。在 location 块中添加:
-
proxy_next_upstream error timeout http_500 http_502 http_503 http_504:明确指定哪些情况触发重试 -
proxy_next_upstream_tries 3:最多重试 2 次(共 3 次尝试,含首次) -
proxy_next_upstream_timeout 10s:重试总耗时上限,防卡死
location / {
proxy_pass http://java_backend;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
配置 backup 备用服务器应对全量故障
当所有主节点都不可用时,流量可自动切到灾备节点(例如维护页、降级服务或异地集群):
-
backup标志让该 server 默认不参与轮询 - 它同样支持
max_fails和fail_timeout,避免备用节点自己也挂了还强行接管
upstream java_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;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.99:8080 backup max_fails=2 fail_timeout=20s;
}
Java 侧需配合的基础要求
Nginx 的故障转移能力依赖 Java 服务的“可探测性”:
- 接口响应要真实返回 500/502/503/504(不能静默超时或返回 200+错误体)
- 避免长阻塞接口,合理设置 Tomcat/Spring Boot 的
server.tomcat.connection-timeout(建议 ≤ 30s) - 建议暴露
/actuator/health等健康端点,虽 Nginx 不主动调用,但便于人工巡检或后续接入外部探活工具
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











