在 nginx 中优化高并发下的 upstream 故障转移性能,核心在于减少健康检查的延迟并避免惊群效应。具体做法是启用 `ngx_http_upstream_hc_module` 进行主动健康检查,并将 `fail_timeout` 设置为较短的时间(如 5-10 秒)以快速剔除故障节点,同时配合 `max_fails` 限制重试次数。这样当后端节点宕机时,nginx 能迅速感知并切换流量,而不是等待 tcp 连接超时或应用层错误返回后才失败转移。

如何配置主动健康检查以减少故障检测延迟
通过配置主动健康检查模块,Nginx 会定期向后端发送探测请求,从而在客户端请求到达前就识别出故障节点。这比被动等待客户端请求失败后再剔除要快得多,显著降低了故障转移的平均响应时间。

http {
upstream backend {
server 192.168.1.1:80;
server 192.168.1.2:80;
# 启用主动健康检查
health_check interval=5 fails=3 passes=2 uri=/health;
# 设置故障转移参数
fail_timeout=10s max_fails=3;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
上述配置中,`interval=5` 表示每 5 秒进行一次健康检查,`fails=3` 表示连续 3 次检查失败才标记为不可用,`passes=2` 表示连续 2 次成功才恢复可用。`fail_timeout=10s` 和 `max_fails=3` 则用于被动故障转移,即在 10 秒内如果某个节点失败超过 3 次,则将其从池中暂时移除。这种组合策略确保了在高并发场景下,故障节点能被快速隔离,新请求能立即路由到健康节点,从而优化了故障转移的性能。
如何通过负载均衡算法降低故障转移时的抖动
在高并发场景下,如果使用默认的轮询算法,故障转移可能导致大量请求集中到剩余的健康节点,引发负载不均和新的故障。采用加权轮询或 IP Hash 等算法,并结合合理的权重分配,可以平滑流量分布,减少故障转移时的系统抖动。

upstream backend {
# 使用加权轮询算法
least_conn;
server 192.168.1.1:80 weight=5;
server 192.168.1.2:80 weight=3;
server 192.168.1.3:80 weight=2;
# 故障转移配置
fail_timeout=10s max_fails=3;
}
在这个配置中,使用了 `least_conn` 算法,它会将新请求发送给当前连接数最少的服务器。这不仅有助于平衡负载,还能在某个节点故障时,自动将流量分散到其他节点,避免单点过载。`weight` 参数允许根据服务器的处理能力分配不同的权重,确保高性能节点承担更多流量。当某个节点因故障被剔除时,剩余节点的权重会自动重新计算,保持整体负载均衡,从而优化了故障转移过程中的性能表现。
当所有上游节点都故障时 Nginx 的行为是什么
当所有配置的 upstream 节点都标记为不可用时,Nginx 会根据配置决定如何处理后续请求。默认情况下,Nginx 会返回 502 Bad Gateway 错误,但可以通过配置 `error_page` 指令来提供自定义的错误页面或重定向到其他服务,以提升用户体验和系统的容错能力。
server {
listen 80;
location / {
proxy_pass http://backend;
# 自定义错误处理
error_page 502 /custom_502.html;
location = /custom_502.html {
root /usr/share/nginx/html;
internal;
}
}
}
在上述配置中,当所有后端节点都故障时,Nginx 会尝试加载 `/custom_502.html` 文件作为错误响应。这要求该文件存在于指定的根目录下,并且使用 `internal` 指令限制只能通过内部重定向访问,防止外部直接请求该 HTML 文件。这种机制确保了即使在极端故障情况下,用户也能看到一个友好的提示页面,而不是原始的 502 错误信息,从而提升了系统的健壮性和用户体验。











