nginx自动剔除与恢复
是的,Nginx 能够通过健康检查(Health Check) 机制来实现后端故障节点的自动剔除与恢复。这是构建高可用后端服务集群的关键功能。
为了帮助你快速理解,我梳理了 Nginx 健康检查的核心机制:
检查方式 | 工作原理 | 关键配置参数 | 触发条件(示例) | 优点与注意 |
被动检查 | Nginx 根据处理实际请求的成功与否来判断节点健康。 |
| 30秒内连续3次请求失败 | 默认支持,配置简单。但有滞后性,可能影响少量用户体验。 |
主动检查 | Nginx 定期主动向后端节点发送特定请求(如 HTTP、TCP)来探测其健康状态。 |
| 连续3次检查失败标记为不健康;连续2次检查成功则重新标记为健康。 | 响应更及时,能在用户请求到来前发现故障。通常需第三方模块(如 |
⚙️ 如何配置 Nginx 的健康检查
Nginx 的健康检查分为被动检查(默认支持)和主动检查(需配置或使用模块)。
1. 被动健康检查(默认)
被动检查依赖于对实际用户请求的处理结果。这是通过 upstream
块中的 max_fails
和 fail_timeout
参数实现的。
http {upstream backend {# 在30秒内,连续失败3次,则该节点被标记为不可用30秒server backend1.example.com max_fails=3 fail_timeout=30s;server backend2.example.com max_fails=3 fail_timeout=30s;server backend3.example.com max_fails=3 fail_timeout=30s;}server {listen 80;location / {proxy_pass http://backend;# 定义在什么情况下请求应转发到下一台服务器proxy_next_upstream error timeout http_500 http_502 http_503 http_504;}}
}
关键参数解释:
max_fails
: 在fail_timeout
时间内,与服务器通信的连续失败次数(如连接超时、连接拒绝或配置的proxy_next_upstream
错误)超过此值,Nginx 会将该服务器标记为不可用。fail_timeout
:
- 统计
max_fails
的时间窗口。 - 服务器被标记为不可用后,持续的不可用时间。超过此时间后,Nginx 会再次尝试将请求 probes 给该服务器。
- 统计
proxy_next_upstream
: 指定在哪些错误情况下应将请求转发到下一个后端服务器。
2. 主动健康检查(推荐)
主动检查通过第三方模块(如 nginx_upstream_check_module
)或 Nginx Plus 实现。Nginx 定时主动向后端节点发送健康检查请求,并根据响应判断其状态。
http {upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;# 开启主动健康检查 (nginx_upstream_check_module 模块语法)check interval=3000 rise=2 fall=3 timeout=1000 type=http;check_http_send "HEAD /health HTTP/1.0\r\n\r\n"; # 发送健康检查请求check_http_expect_alive http_2xx http_3xx; # 认为健康的状态码}server {listen 80;location / {proxy_pass http://backend;}# 提供一个查看健康检查状态的页面location /nstatus {check_status;access_log off;}}
}
关键参数解释 (以 nginx_upstream_check_module
为例):
interval
: 健康检查的间隔时间(例如3000
毫秒)。fall
: 连续失败多少次后将节点标记为不健康(例如3
次)。rise
: 连续成功多少次后将不健康的节点重新标记为健康(例如2
次)。timeout
: 每次健康检查请求的超时时间。type
: 健康检查协议类型,如http
,tcp
,ssl_hello
等。
🔧 故障转移与恢复流程
其自动故障剔除与恢复的流程,可以概括为以下几步:
- 健康检查:Nginx 通过被动或主动方式检查后端节点。
- 故障判定:当健康检查失败次数达到阈值(如
max_fails
或fall
),Nginx 将该节点标记为 “不健康”。 - 自动剔除:Nginx 停止向“不健康”的节点转发用户请求,流量被引导至其他健康的节点。
- 恢复检查:对于被剔除的节点,Nginx 会持续进行健康检查。
- 自动恢复:当健康检查成功的次数达到阈值(如
rise
),Nginx 会认为该节点已恢复,并重新将其加入负载均衡池,开始向其转发流量。
⚠️ 注意事项
- 模块需求:上述的
check
指令通常需要nginx_upstream_check_module
等第三方模块支持,而非 Nginx 开源版自带。编译时需手动添加此模块。 - 商业版本:Nginx Plus 提供了功能更强大、更易用的主动健康检查功能,无需第三方模块。
- 合理配置参数:
interval
、fall
、rise
、timeout
等参数需要根据实际业务和后端服务的处理能力进行合理设置,以避免误判或发现延迟。
💎 总结
Nginx 完全能够通过健康检查机制实现后端故障节点的自动剔除与恢复。
- 对于被动检查,利用
max_fails
和fail_timeout
等参数可实现基本的故障转移。 - 对于更及时、更可靠的主动检查,通常需要通过
nginx_upstream_check_module
等第三方模块或 Nginx Plus 商业版来实现。
建议你根据实际情况,为 Nginx 配置合适的健康检查机制,这能有效提升你后端服务的可用性和可靠性。