proxy_next_upstream 触发故障转移时 keepalive 连接状态如何变化
nginx 在启用 keepalive 长连接并配置了 proxy_next_upstream 进行故障转移时,如果上游服务器返回错误导致 nginx 切换到下一个节点,当前已建立的长连接会被立即关闭。这是因为 nginx 无法将已经发送给第一个节点的请求数据(如 post body)自动转发给备用节点,为了保证数据一致性,只能放弃该连接并重新建立新的连接。

如何配置以最小化故障转移带来的性能损耗
为了减少因故障转移导致的连接重建开销,应合理设置 keepalive_requests 和 keepalive_timeout,并在 upstream 块中为每个后端服务器预留足够的空闲连接数。同时,通过 proxy_next_upstream 限制不必要的重试条件,避免对非致命错误进行频繁切换。

events {
worker_connections 1024;
}
http {
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
keepalive 32;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
}
}
}
当上游服务器返回 HTTP 502 时 keepalive 池中的连接会发生什么
当上游服务器返回 HTTP 502 Bad Gateway 且该状态码被包含在 proxy_next_upstream 的配置中时,Nginx 会尝试连接到下一个可用的上游服务器。在此过程中,指向故障服务器的 keepalive 连接将被丢弃,不会放回连接池中供后续请求复用。这会导致客户端的长连接中断,但 Nginx 与后端之间的空闲连接池会自动清理无效连接,防止资源浪费。











