nginx upstream 块在 http 块内声明多个后端节点,支持 ip/域名/端口/unix socket 混合配置;默认轮询,可配 weight、max_fails、backup 等参数及 least_conn、ip_hash 等负载策略,并需用 nginx -t 验证语法、查 error.log 排错。

在 Nginx 的 upstream 块中添加多个后端服务器节点,核心是把它们统一声明在 http 块内,并用 server 指令逐行列出。不需要额外插件或模块,原生支持 IP、域名、端口甚至 Unix socket 混合配置。
基础写法:直接列地址即可
每台后端服务写一行 server,Nginx 默认按轮询方式分发请求:
server 192.168.1.10:8080;server 192.168.1.11:8080;server api.example.com:3000;server unix:/var/run/backend.sock;
注意:upstream 块必须放在 http 块内部,不能嵌套在 server 或 location 中。
带控制参数的写法:适配真实环境
单纯列地址不够稳健,建议为每个节点加上关键参数,应对性能差异和故障场景:
- 用
weight=数字区分处理能力,比如新机器设weight=5,老机器设weight=2 - 加
max_fails=3 fail_timeout=30s启用被动健康检查,连续失败 3 次就暂停 30 秒 - 标
backup的节点只在其他全部不可用时启用,适合灾备机 - 同一 upstream 内可混用不同协议类型,例如 HTTP 节点 + Unix socket 节点
配合负载策略使用更精准
节点加完后,可在 upstream 块开头指定算法,改变默认轮询行为:
-
least_conn;—— 请求发给当前连接最少的后端,适合长连接或响应时间波动大的服务 -
ip_hash;—— 同一客户端 IP 总是打到同一台后端,适用于未共享 session 的应用 -
hash $request_uri consistent;—— 需第三方模块,适合缓存一致性要求高的场景
策略指令必须写在所有 server 行之前,否则不生效。
验证是否识别成功
配置保存后别急着 reload,先做两件事:
- 运行
nginx -t确认语法无误,常见错误是少分号、多逗号或地址格式非法(如写成http://开头) - 查
error.log,如果出现host not found in upstream,说明某个域名解析失败或地址不可达 - 临时在后端返回头里加
X-Backend-ID,用curl多次请求看是否轮换出现不同值











