Nginx通过upstream定义后端组并用proxy_pass引用即可自动轮询;upstream须置于http块内,名称需一致;proxy_pass须写为http://name/形式,透传关键请求头,并经nginx -t验证后reload生效。
直接用 upstream 定义后端组,再通过 proxy_pass 引用它,Nginx 就会自动启用轮询转发,不需要额外开启或写算法指令。
upstream 块必须放在 http 范围内
它不能写在 server 或 location 里,只能位于 http { … } 大括号内部。名称自定义(比如 backend、api_cluster),但要确保后续引用时拼写完全一致:
- 每行一个 server,格式为 server IP:端口; 或 server 域名:端口;
- 不加任何参数时,默认就是轮询,请求依次发给列表中的第一台、第二台、第三台……循环往复
- 推荐显式写出端口(如 :8080),避免因默认端口不匹配导致转发失败
proxy_pass 必须指向 upstream 名称
location 中的 proxy_pass 后面要写成 http://backend 这种形式(协议 + 斜杠 + upstream 名字),而不是具体地址。写成 proxy_pass http://192.168.1.10:8080; 就绕过了负载均衡,只走单点。
- 末尾斜杠影响路径拼接:proxy_pass http://backend/ 会截掉 location 匹配部分;不带斜杠则原样拼接
- 务必透传 Host、X-Real-IP、X-Forwarded-For 这三个请求头,否则后端拿不到真实客户端信息
别忘了基础运维动作
改完配置不是立刻生效,得走标准流程验证和加载:
- 运行 sudo nginx -t 检查语法是否正确,有错误会明确提示哪一行出问题
- 确认无误后执行 sudo systemctl reload nginx(或 sudo nginx -s reload),平滑重载配置
- 可通过访问服务并查看各后端访问日志,确认请求确实在几台机器间交替出现
轮询之外还有几种常用策略可选
如果默认轮询不满足需求,可以在 upstream 块开头加一行指令切换算法:
-
least_conn:把新请求发给当前连接数最少的后端,适合长连接或响应时间差异大的场景
-
ip_hash:同一客户端 IP 总是落到同一台后端,用于需要会话保持的业务
-
weight=数字:给不同 server 设置权重,比如 weight=3 和 weight=1 表示 3:1 的流量比例