Nginx upstream支持轮询、加权轮询和IP_Hash三种负载均衡策略:轮询默认均分请求,适合无状态服务;加权轮询按weight分配流量,适配性能不均服务器;IP_Hash通过客户端IP哈希实现会话保持,但不支持weight且扩缩容易导致会话中断。

直接上配置,按实际场景选策略:轮询适合无状态服务,加权轮询适配性能不均的机器,IP 哈希用于需要会话保持的业务(比如登录态、购物车)。三者不能混用,必须在 upstream 块里明确指定一种。
轮询(Round Robin)——默认最简方案
不写额外指令就是轮询。请求按顺序逐台分发,每台机会均等,适合静态资源、API 等无状态服务。
- 基础写法:
upstream backend {<br> server 192.168.1.10:8080;<br> server 192.168.1.11:8080;<br> server 192.168.1.12:8080;<br>} - 自动健康检查:加
max_fails=3 fail_timeout=30s,连续失败 3 次后,30 秒内不再转发请求到该节点 - 建议搭配
proxy_set_header X-Real-IP $remote_addr,方便后端记录真实来源
加权轮询(Weighted Round Robin)——按能力分配流量
给服务器设 weight 值,数值越大承担请求越多。总权重决定比例,比如 weight=3、2、1 → 分配比为 50% / 33% / 17%。
- 配置示例:
upstream backend {<br> server 192.168.1.10:8080 weight=3;<br> server 192.168.1.11:8080 weight=2;<br> server 192.168.1.12:8080 weight=1;<br>} - weight 只支持整数,最小为 1;不填则默认为 1
- 注意:不能和
ip_hash共存,否则 Nginx 启动报错 - 扩容时可临时调低新机器 weight,观察稳定性后再逐步拉满
IP 哈希(ip_hash)——固定用户到同一后端
对客户端 IP 做哈希运算,确保同一 IP 始终打到同一台后端。适用于有 session 或本地缓存依赖的场景。
- 启用方式:在 upstream 中第一行加
ip_hash;upstream backend {<br> ip_hash;<br> server 192.168.1.10:8080;<br> server 192.168.1.11:8080;<br> server 192.168.1.12:8080;<br>} - 不支持 weight,写了会启动失败
- 增删任一 server,所有已有 IP 映射重算 → 大量用户会话中断,慎用于生产扩缩容
- NAT 环境下(如公司出口、运营商共享 IP)会导致负载倾斜,需配合 cookie 或 token 做会话同步
- IPv6 默认只取前 64 位哈希,若业务依赖完整地址一致性,需确认是否满足
通用增强建议
无论用哪种策略,这几项配置能显著提升可用性:
- 加
backup标识备用节点:server 192.168.1.13:8080 backup;,仅当其他全不可用时才启用 - 记录转发日志:
log_format main '$remote_addr - $upstream_addr - $time_local';,便于排查分配是否符合预期 - 开启长连接复用:
upstream块内加keepalive 32;,减少 TCP 握手开销 - 代理头别漏:
proxy_set_header Host $host;和X-Forwarded-For $remote_addr;是后端识别的关键


















