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:设置权重
为每个 server 行添加 weight 参数。权重必须是正整数(>=1),默认值为 1。
步骤 3:检查语法
执行 sudo nginx -t 确保没有拼写错误。如果有报错,根据提示行号修正。
步骤 4:重载配置
执行 sudo nginx -s reload 使配置生效,无需停止服务。
后端标识配置(验证必备)
为了直观验证流量分布,建议在后端服务器的 Nginx 配置中添加响应头,返回当前服务器地址。
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。
server 192.168.1.12:8080 backup;2. 权限问题
nginx 命令通常绑定在特权端口或需要访问保护文件,执行 -t 和 reload 时请确保使用 sudo 或 root 用户,否则可能提示 permission denied。
3. 长连接影响
如果开启了 keepalive,连接复用可能导致请求分布看起来不均匀,因为一个连接可能处理多个请求。验证时建议关闭客户端 keepalive 或统计连接数而非请求数。
4. 健康检查配合
加权轮询本身不包含主动健康检查。如果高权重服务器宕机,Nginx 默认会在失败一定次数后暂时剔除,但建议配合 max_fails 和 fail_timeout 参数使用。