在 nginx 中,轮询转发结合 proxy_next_upstream 的核心做法是:在 upstream 块中使用默认的轮询算法(或显式声明 round_robin),并在 location 块中配置 proxy_next_upstream 指令。当当前上游服务器处理请求失败或超时且满足指定条件时,nginx 会自动将请求转发给下一个可用的上游服务器,从而实现故障转移和负载均衡。

如何配置 upstream 实现基础轮询
要实现基础的轮询转发,需要在 Nginx 配置文件的 http 块中定义一个 upstream 模块,并在其中列出多个后端服务器地址。默认情况下,Nginx 的 upstream 就是使用轮询(Round Robin)算法,即按顺序依次将请求分发给每个服务器,如果某台服务器宕机,它会被自动剔除,直到恢复后重新加入。

upstream backend_pool {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_pool;
# 其他代理设置...
}
}
上述配置中,backend_pool 定义了三个后端服务器。Nginx 会按顺序将请求分配给 192.168.1.10、192.168.1.11、192.168.1.12,然后循环往复。这种配置确保了负载均匀分布,但尚未启用故障转移机制。
如何配置 proxy_next_upstream 实现故障转移
要使轮询具备故障转移能力,必须在 location 块中添加 proxy_next_upstream 指令。该指令指定了哪些错误情况触发 Nginx 尝试下一个上游服务器。常见的选项包括 error(连接错误)、timeout(超时)、invalid_header(无效响应头)等。默认行为通常包含 error 和 timeout,但建议显式配置以确保符合预期。

upstream backend_pool {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_pool;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
}
}
在上述配置中,proxy_next_upstream 指定了当遇到连接错误、超时、无效头部或 HTTP 5xx 状态码时,Nginx 将尝试下一个上游服务器。proxy_next_upstream_tries 限制最大重试次数为 3 次,proxy_next_upstream_timeout 限制总重试时间为 10 秒。这样,即使某个后端服务器出现故障,请求也能被转移到其他健康服务器,提高系统可用性。
当所有上游服务器都返回 502 时,客户端会收到什么响应
当所有上游服务器都返回 502 Bad Gateway 错误时,Nginx 会将最后一个上游服务器的响应直接返回给客户端。这意味着客户端最终会收到一个 502 错误页面,而不是 Nginx 自行生成的错误页。这是因为 proxy_next_upstream 仅在特定条件下触发转移,如果所有服务器都返回相同的错误类型且未配置 proxy_intercept_errors,Nginx 不会拦截这些错误,而是透传原始响应。











