nginx中upstream负载均衡需定义在http块内,名称仅含字母数字和短横线,每台后端须带端口,配合proxy_pass引用,并设置健康检查与透传头。

在 Nginx 中用 upstream 实现多台后端服务器负载均衡,关键是定义一个服务器组,并让请求按策略分发过去。配置本身不复杂,但位置、语法和参数细节出错会导致转发失败或流量不均。
必须把 upstream 块写在 http 作用域内
upstream 定义不能放在 server 或 location 块里,否则 Nginx 启动会报错。正确位置是主配置文件(如 /etc/nginx/nginx.conf 或 /www/server/nginx/conf/nginx.conf)的 http { } 块中,且建议加在所有 include 语句之前。
- 示例写法:
http {
upstream my_backend {
server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080;
server 127.0.0.1:8081 backup;
}
include /etc/nginx/conf.d/*.conf;
}
- 名称只能含字母、数字、短横线(
-),不能有下划线(_)或空格 - 每台后端地址必须带端口,避免依赖默认端口导致转发异常
- 确保 Nginx 所在机器能直连这些 IP 和端口(网络通、防火墙放行)
选择适合业务的调度算法
算法决定请求怎么落到各后端,不同场景要选对策略:
- 轮询(默认):不加任何指令即启用,顺序分发,适合无状态、性能相近的服务
-
least_conn:在 upstream 块开头写
least_conn;,优先发给当前连接数最少的节点,适合长连接或响应时间波动大的业务 -
ip_hash:写
ip_hash;,按客户端 IP 哈希固定路由,适用于需会话粘滞(如本地 session)的应用;注意它会削弱负载分散效果 -
weight:给 server 加
weight=数值,比如高配机器设为weight=5,普通机器保持默认 1;不能与ip_hash共存
在 server 块中完成反向代理并透传关键头
定义好 upstream 后,必须在某个 server 的 location 里引用它:
-
proxy_pass http://my_backend;—— 名称必须完全一致,且带http://前缀 -
proxy_set_header Host $host;—— 保留原始 Host,防止后端路由或 HTTPS 跳转异常 -
proxy_set_header X-Real-IP $remote_addr;—— 让后端拿到真实客户端 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 多层代理时补全 IP 链 - 建议加上超时控制:
proxy_connect_timeout 5s;、proxy_read_timeout 10s;
加入健康检查与容错参数
仅列 IP 不足以应对故障,要靠参数让 Nginx 主动识别并规避问题节点:
-
max_fails=3 fail_timeout=30s:30 秒内连续失败 3 次,该节点被标记为不可用,30 秒后自动重试 -
backup:仅当所有非 backup 节点都不可用时才启用,适合灾备服务器 -
down:手动维护时使用,该节点不参与任何调度 - Nginx 默认是被动健康检查(靠实际请求触发),不支持主动探活(Nginx Plus 才有)
配置完务必执行 nginx -t 检查语法,再用 systemctl reload nginx 生效。可手动停掉一台后端,观察日志确认请求是否自动切走。











