Nginx 1.24 版本如何配置 upstream 实现加权轮询负载均衡

文章导读
Nginx 默认支持加权轮询,只需在 upstream 块中为 server 指令添加 weight 参数即可,适用于后端服务器性能不一致的场景。该功能为核心模块特性,并非特定版本独有。
📋 目录
  1. 命令速用版
  2. 原理简述
  3. 分步处理
  4. 后端标识配置(验证必备)
  5. 怎么验证是否生效
  6. 常见坑
A A

Nginx 默认支持加权轮询,只需在 upstream 块中为 server 指令添加 weight 参数即可,适用于后端服务器性能不一致的场景。该功能为核心模块特性,并非特定版本独有。

先说结论:配置加权轮询不需要额外模块,直接在 upstream 中设置 weight 值即可生效。

  • 适合:后端服务器配置高低不一,希望流量按比例分配的场景
  • 先准备:确认 Nginx 版本及后端服务可达性,备份原有配置文件
  • 验收:通过访问日志或循环请求验证流量分布是否符合预期权重
  • 注意:执行配置命令通常需要 root 权限(sudo)

命令速用版

核心配置片段如下,将其放入 http 块中的 upstream 定义内:

upstream backend_pool {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=1;
}

修改后执行以下命令检查并重载(需管理员权限):

sudo nginx -t
sudo nginx -s reload

原理简述

Nginx 的 upstream 模块默认采用加权轮询算法。当没有指定其他负载均衡方法(如 ip_hash 或 least_conn)时,请求会按顺序分发给后端服务器。weight 参数指定了服务器的相对权重,权重越高,被选中的概率越大。例如 weight=3 和 weight=1 的两台服务器,理论上接收的请求比例约为 3:1。

分步处理

步骤 1:编辑配置文件

找到 nginx.conf 或 conf.d 下的站点配置,定位到 upstream 块。如果没有,需要在 http 块内新建。

步骤 2:设置权重

Nginx 1.24 版本如何配置 upstream 实现加权轮询负载均衡

为每个 server 行添加 weight 参数。权重必须是正整数(>=1),默认值为 1。

步骤 3:检查语法

执行 sudo nginx -t 确保没有拼写错误。如果有报错,根据提示行号修正。

步骤 4:重载配置

执行 sudo nginx -s reload 使配置生效,无需停止服务。

后端标识配置(验证必备)

为了直观验证流量分布,建议在后端服务器的 Nginx 配置中添加响应头,返回当前服务器地址。

Nginx 1.24 版本如何配置 upstream 实现加权轮询负载均衡
server {
    listen 8080;
    server_name _;
    # 添加自定义响应头,便于识别后端
    add_header X-Backend-IP $server_addr;
    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

怎么验证是否生效

方法 1:查看访问日志

在 backend server 上查看 access.log,统计单位时间内的请求数。如果权重配置为 3:1,高权重服务器的日志增长应明显更快。

sudo tail -f /var/log/nginx/access.log

方法 2:循环请求测试

在客户端使用 shell 循环发送请求,观察响应头中返回的后端服务器标识。

for i in {1..100}; do curl -sI http://your-domain.com | grep "X-Backend-IP"; done

若未看到输出,请确认后端已配置 add_header 且 curl 命令使用了 -I 或 -i 参数查看头信息。

常见坑

1. 权重值限制

weight 参数必须为正整数。如需设置备份服务器(仅当主服务器不可用时启用),请使用 backup 参数,不要尝试使用 weight=0。

Nginx 1.24 版本如何配置 upstream 实现加权轮询负载均衡
server 192.168.1.12:8080 backup;

2. 权限问题

nginx 命令通常绑定在特权端口或需要访问保护文件,执行 -t 和 reload 时请确保使用 sudo 或 root 用户,否则可能提示 permission denied。

3. 长连接影响

如果开启了 keepalive,连接复用可能导致请求分布看起来不均匀,因为一个连接可能处理多个请求。验证时建议关闭客户端 keepalive 或统计连接数而非请求数。

4. 健康检查配合

加权轮询本身不包含主动健康检查。如果高权重服务器宕机,Nginx 默认会在失败一定次数后暂时剔除,但建议配合 max_fails 和 fail_timeout 参数使用。