Nginx中upstream块定义后端服务器组,默认加权轮询(权重均为1),不监听端口;端口由server块的listen指令控制,通过proxy_pass转发请求;健康检查被动触发,默认max_fails=1、fail_timeout=10s。

在 Nginx 中,upstream 块用于定义后端服务器组,默认采用加权轮询(weighted round-robin)调度算法,且所有服务器权重默认为 1。它本身不监听端口——监听行为由 server 块中的 listen 指令控制,upstream 只负责转发请求到指定的 IP 和端口。
upstream 默认轮询机制详解
当未显式设置 weight、max_fails、fail_timeout 等参数时,Nginx 将按如下方式处理:
- 所有服务器权重均为 1,请求严格按顺序逐一分配(如 server1 → server2 → server3 → server1…)
- 健康检查非主动开启:只有在请求失败(如连接超时、502/504)且触发
max_fails限制后,才会临时摘除节点 - 默认
max_fails=1,fail_timeout=10s,即 10 秒内失败 1 次就标记为不可用,10 秒后自动重试 - 不启用会话保持(sticky)、IP hash 或 least_conn,除非手动配置
如何正确关联 upstream 与监听端口
upstream 本身无端口概念,端口绑定发生在 server 块。常见结构如下:
- 在
http块中定义upstream my_backend { server 192.168.1.10:8080; server 192.168.1.11:8080; } - 在
server块中通过listen 80;或listen 443 ssl;暴露服务端口 - 使用
proxy_pass http://my_backend;将该 server 接收的请求转发至 upstream 定义的后端地址和端口 - 注意:
proxy_pass后的 URL 中的端口(如:8080)是后端服务监听的端口,不是 Nginx 自己监听的端口
常用增强配置示例
根据实际需求,可添加以下参数提升可用性与灵活性:
-
weight=3:提高某台服务器分流量比例(如高性能机器) -
max_fails=3 fail_timeout=30s:放宽容错窗口,避免短暂抖动误摘 -
backup:标记为备用节点,仅当其他节点全部不可用时启用 -
down:永久下线某节点(常用于维护),不参与任何调度 -
ip_hash;:启用客户端 IP 哈希,实现基础会话保持(不适用于有前置代理的场景)
验证与调试要点
修改配置后需验证语法并重载,同时关注实际调度效果:
- 运行
nginx -t检查配置合法性,再nginx -s reload生效 - 通过
curl -I http://your-domain/多次请求,结合后端 access log 观察分发是否均衡 - 查看 Nginx error log(
error_log /path/to/error.log warn;)确认是否有 upstream 连接失败或超时记录 - 使用
stub_status模块(需编译启用)或第三方模块如nginx-module-vts实时监控 upstream 状态










