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},请求分布更均匀。算法逻辑:
- 每个服务器有三个权重变量:weight(配置值)、effective_weight(有效权重)、current_weight(当前权重)
- 每次请求,所有服务器current_weight += effective_weight
- 选择current_weight最大的服务器
- 被选中的服务器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 A | 16核32G | 10 | 67% |
| Server B | 8核16G | 4 | 27% |
| Server C | 4核8G | 1 | 6% |
常见问题
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辅助作者原创,未经许可,转载请保留原文链接。

发表评论