nginx 中 upstream 轮询负载均衡通过 round_robin 算法实现,只需在 upstream 块中列出后端服务器即可。默认情况下,nginx 会按顺序将请求依次分配给列表中的服务器,当某台服务器宕机时会自动剔除。配置方法是在 nginx.conf 的 http 块内定义 upstream 组,并在 server 块中使用 proxy_pass 指向该组。

如何配置基本的 upstream 轮询组
基本配置只需在 http 上下文中创建一个 upstream 块,并在其中添加多个 server 指令。Nginx 默认使用轮询(Round Robin)策略,即每个请求按时间顺序逐一分配到不同的后端服务器。以下是一个包含两个后端服务器的完整配置示例:
worker_processes 1;
events {
worker_connections 1024;
}
http {
upstream backend_pool {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}预期结果:第一个请求到达 192.168.1.10,第二个请求到达 192.168.1.11,第三个请求再次回到 192.168.1.10,如此循环。如果 192.168.1.10 不可用,所有请求将自动转发到 192.168.1.11。
如何调整轮询权重以处理负载不均
当后端服务器性能不同时,可以通过 weight 参数调整轮询比例。权重越高,被分配的请求越多。例如,若一台服务器性能是另一台的两倍,可设置权重为 2 和 1。这样每 3 个请求中,高性能服务器接收 2 个,低性能服务器接收 1 个。以下是调整权重后的配置:
upstream weighted_pool {
server 192.168.1.10:8080 weight=2;
server 192.168.1.11:8080 weight=1;
}预期结果:请求分配模式变为 10 -> 10 -> 11 -> 10 -> 10 -> 11,依此类推。这种配置适用于后端硬件配置不一致的场景,确保资源利用更均衡。若未指定 weight,默认值为 1。
当后端服务器返回 502 错误时轮询行为如何变化
当后端服务器返回 502 Bad Gateway 或连接超时等错误时,Nginx 的默认轮询行为会将当前请求重试下一个可用的后端服务器。这是由 proxy_next_upstream 指令控制的,默认启用 error 和 timeout。这意味着如果第一个服务器失败,Nginx 不会直接返回错误给用户,而是尝试列表中的下一台服务器。以下配置展示了这一行为:
location / {
proxy_pass http://backend_pool;
proxy_next_upstream error timeout;
proxy_next_upstream_tries 2;
proxy_next_upstream_timeout 10s;
}预期结果:若 192.168.1.10 返回 502,Nginx 自动将请求转发给 192.168.1.11。用户最终收到的是来自健康服务器的响应。若所有服务器均失败,则返回最后一个错误。此机制提高了服务的可用性,但需注意避免无限重试导致延迟增加。


















