在Nginx负载均衡配置中,若上游(upstream)有一台服务器挂掉,默认情况下Nginx仍会尝试将请求转发到该故障服务器(可能导致请求失败)。但通过合理配置可以自动规避故障节点,以下是具体说明和解决方案:
1. 核心机制与配置
Nginx的负载均衡模块提供了健康检查机制,需手动配置才能实现自动剔除故障节点:
(1)被动健康检查(默认不开启)
upstream backend {
server 192.168.1.101:80 max_fails=3 fail_timeout=30s; # 允许失败3次后暂停30秒
server 192.168.1.102:80;
server 192.168.1.103:80;
}
- max_fails: 允许的最大失败次数(默认1)。
- fail_timeout: 失败后暂停转发的时间(默认10秒)。
⚠️ 注意:被动检查依赖实际请求的失败反馈,可能仍有短暂错误。
(2)主动健康检查(推荐方案)
需使用nginx-plus
商业版或开源模块ngx_http_upstream_check_module
:
upstream backend {
server 192.168.1.101:80;
server 192.168.1.102:80;
server 192.168.1.103:80;
check interval=3000 rise=2 fall=3 timeout=2000 type=http;
check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
- interval: 检查间隔(毫秒)。
- rise/fall: 成功/失败阈值。
- type: 检查协议(HTTP/TCP等)。
2. 替代方案
如果无法添加模块,可通过以下方式临时处理:
- 手动下线节点:修改配置后重载Nginx。
- 第三方工具:如Consul + Nginx动态更新Upstream。
3. 验证方法
查看Nginx状态接口或日志:
tail -f /var/log/nginx/error.log # 观察错误日志
curl http://nginx-status # 需要配置stub_status模块
总结
方案 | 适用场景 | 缺点 |
---|---|---|
max_fails |
简单场景 | 依赖真实请求失败 |
健康检查模块 |
高可用生产环境 | 需额外安装或商业版支持 |
建议根据业务需求选择合适方案。如果是生产环境,强烈建议启用主动健康检查。
内容由零声教学AI助手提供,问题来源于学员提问