nginx 的 upstream 模块通过健康检查机制处理数据库后端连接异常。当配置了 max_fails 和 fail_timeout 参数时,nginx 会统计后端服务器在指定时间内的失败次数,一旦超过阈值,该服务器将被暂时标记为不可用,请求将自动转移到其他健康的后端节点。

如何配置 Nginx 上游服务器的故障转移参数
要启用故障转移,必须在 upstream 块中定义后端服务器列表,并为每个服务器设置 max_fails 和 fail_timeout。max_fails 定义了允许的最大失败次数,fail_timeout 定义了统计失败次数的时间窗口以及服务器被标记为不可用的持续时间。默认情况下,如果未显式配置,Nginx 使用 max_fails=1 和 fail_timeout=10s。

http {
upstream database_backend {
server 192.168.1.10:3306 max_fails=3 fail_timeout=30s;
server 192.168.1.11:3306 max_fails=3 fail_timeout=30s;
server 192.168.1.12:3306 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
location /db-proxy {
proxy_pass http://database_backend;
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
}
}
}在上述配置中,如果某个后端服务器(如 192.168.1.10)在 30 秒内连续发生 3 次连接或响应失败,Nginx 将在接下来的 30 秒内不再向该服务器发送请求。在此期间,所有新请求将被轮询或按权重分配给其他可用的后端服务器(192.168.1.11 和 192.168.1.12)。这种机制确保了单个节点的故障不会导致整个服务不可用。
故障转移期间客户端请求如何处理
当 Nginx 检测到某台后端服务器进入“不可用”状态后,它会将该服务器从当前的负载均衡池中移除。客户端的请求会被重新路由到剩余的健康服务器上。如果所有配置的服务器都因故障而被标记为不可用,Nginx 将根据 next_upstream 指令决定是否重试其他服务器或直接向客户端返回错误。

server {
listen 80;
location /db-proxy {
proxy_pass http://database_backend;
# 关键配置:允许在特定错误发生时重试下一个上游服务器
next_upstream error timeout invalid_header http_500 http_502 http_503;
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
}
}next_upstream 指令定义了哪些情况触发重试。例如,error 表示连接错误或超时,timeout 表示读取或写入超时,http_500 等表示后端返回的 HTTP 错误码。如果配置了这些选项,当第一个后端服务器返回错误时,Nginx 会自动尝试连接到列表中的下一个服务器,而不是立即向客户端返回错误。这提高了系统的容错能力,确保即使部分后端出现短暂异常,用户也能获得响应。
后端服务器恢复后如何重新加入集群
当被标记为不可用的后端服务器在 fail_timeout 指定的时间过后,Nginx 会向其发送一个探测请求。如果探测成功,该服务器将被重新标记为可用,并重新纳入负载均衡池。这个过程是自动的,无需手动干预。然而,需要注意的是,Nginx 本身并不提供主动的心跳检测功能,它主要依赖被动健康检查,即基于实际请求的成功或失败来判断服务器状态。
为了更可靠地监控数据库后端的状态,建议结合应用层的心跳机制或使用专门的监控工具。此外,对于数据库连接,确保应用程序层面的连接池配置合理,避免因为 Nginx 的重试机制导致数据库连接数激增。通过合理设置 max_fails 和 fail_timeout,可以在保证高可用性的同时,避免对正常运行的服务器造成不必要的负载。


















