0

Nginx加权轮询weight配置详解:从原理到实战的完整指南

2026.05.22 | youres | 14次围观

什么是Nginx加权轮询

Nginx负载均衡默认使用加权轮询(Weighted Round Robin)算法。与简单轮询不同,加权轮询给每台后端服务器分配一个权重值(weight),权重越高的服务器,接收到的请求越多。

比如三台服务器权重分别是5、3、2,那么7个请求中,第一台会处理3-4个,第二台处理2-3个,第三台处理1-2个,比例接近5:3:2。

基础配置:5行代码实现权重分配

upstream backend {
    server 192.168.1.101 weight=5;  # 高性能服务器,50%流量
    server 192.168.1.102 weight=3;  # 中性能服务器,30%流量
    server 192.168.1.103 weight=2;  # 低性能服务器,20%流量
}

server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://backend;
    }
}

weight参数详解

  • 默认值:weight=1
  • 取值范围:最小1,无上限(但实际配置中一般不超过100)
  • 计算方式:Nginx使用平滑加权轮询算法,避免旧版算法中"连续多个请求打到同一台服务器"的问题

平滑加权轮询算法原理

旧版Nginx加权轮询会产生连续请求,比如权重{5,1,1}会导致{a,a,a,a,a,b,c}这样的序列,5个请求连续打到服务器a。

平滑加权轮询的序列是{a,a,b,a,c,a,a},请求分布更均匀。算法逻辑:

  1. 每个服务器有三个权重变量:weight(配置值)、effective_weight(有效权重)、current_weight(当前权重)
  2. 每次请求,所有服务器current_weight += effective_weight
  3. 选择current_weight最大的服务器
  4. 被选中的服务器current_weight -= total_weight(所有服务器weight之和)

配合健康检查参数

upstream backend {
    server 192.168.1.101 weight=5 max_fails=3 fail_timeout=30s;
    server 192.168.1.102 weight=3 max_fails=2 fail_timeout=10s;
    server 192.168.1.103 weight=2 backup;  # 备用服务器
}
  • max_fails:在fail_timeout时间内,失败次数达到此值,该服务器被标记为不可用
  • fail_timeout:失败统计时间窗口,同时也是服务器被暂停的时间
  • backup:标记为备用服务器,主服务器全部不可用时才启用
  • down:永久标记服务器不可用

实战案例:按服务器性能分配流量

服务器配置weight流量占比
Server A16核32G1067%
Server B8核16G427%
Server C4核8G16%

常见问题

1. weight设为0会报错吗?

会。Nginx规定weight最小值为1,配置weight=0会导致配置文件检查失败:nginx: [emerg] invalid parameter "weight=0"

2. 权重比例不等于精确的请求比例?

是的。平滑加权轮询保证的是长期比例接近配置值,短期可能会有波动。这是正常行为。

3. 如何验证权重是否生效?

查看Nginx访问日志,统计后端服务器的请求分布:

awk "{print \$NF}" access.log | sort | uniq -c | sort -rn

内链推荐

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论
883文章数 0评论数
作者其它文章