Nginx实现upstream轮询与权重分发的核心是在http块定义upstream(支持weight参数设定相对权重比例),再由location中proxy_pass引用;location不参与负载策略配置,仅负责转发请求,且proxy_pass末尾斜杠影响路径重写。

Nginx 实现 upstream 轮询与权重分发,核心不在 location 块里写逻辑,而是在 http 块中定义 upstream,再由 location 里的 proxy_pass 引用它。location 本身不配置轮询或权重,只负责把请求转发给已定义好的 upstream 名称。
1. 先在 http 块里定义 upstream(含轮询和权重)
所有负载均衡策略都写在 `upstream` 块中,位置通常在 `nginx.conf` 的 `http { ... }` 区域内:
upstream my_backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=1;
server 192.168.1.12:8080 weight=2;
}- 不写
weight就是默认轮询(每台服务器等概率接收请求) - 写了
weight就是加权轮询:数值越大,分到的请求越多(比如weight=3的服务器大概会收到 3/6 = 50% 的请求) - 所有
server行支持 IP:端口、域名、Unix socket,也支持max_fails、fail_timeout、backup等状态控制参数
2. 在 server 的 location 中引用 upstream
`location` 块只需用 `proxy_pass` 指向 upstream 名称,协议必须写全(`http://` 或 `https://`):
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://my_backend/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}-
proxy_pass http://my_backend/中的/很关键:它会剥离location匹配的路径前缀(如/api/),再拼接到后端地址上 - 如果写成
proxy_pass http://my_backend;(末尾无/),Nginx 会原样转发完整 URI,容易导致 404
3. 验证是否生效
改完配置后别忘了重载:
- 执行 nginx -t 检查语法
- 执行 nginx -s reload 生效新配置
- 查看 access 日志,确认请求确实打到了不同后端,且比例接近权重比(如 3:1:2)
如果某台后端宕机,Nginx 默认会自动剔除它(基于 `max_fails=1` 和 `fail_timeout=10s` 的默认行为),等恢复后再自动加入——这个机制对轮询和加权轮询都有效。
4. 注意几个常见坑
- upstream 名称必须完全一致:`proxy_pass http://xxx;` 中的 `xxx` 要和 `upstream xxx { ... }` 完全匹配,大小写敏感
- 不能在 location 里重复定义 upstream:Nginx 不允许嵌套或局部定义 upstream,只能全局声明
- 权重不是绝对占比,而是相对比例:`weight=3` 和 `weight=1` 并不意味着 75% vs 25%,还要看其他节点权重总和及当前活跃节点数
- session 问题要单独处理:纯轮询/加权轮询不保证同一用户始终落到同一台后端,如需粘性会话,得换 `ip_hash` 或引入外部 session 存储


















