Nginx 里的 upstream 是什么意思?
upstream 是 Nginx 里"后端服务器组"的抽象:upstream 块定义一组后端供 proxy_pass 引用,自带负载均衡(轮询/权重/ip_hash)、健康摘除;概念、示例与 FAQ。
upstream 是 Nginx 对"后端服务器组"的命名——用 upstream 块把一台或多台后端定义成一个逻辑组,proxy_pass 再引用这个组名。 一组机器时它就兼任负载均衡器:默认轮询分发,还能加权、会话粘滞、失败摘除。
基本结构
# 定义:名为 myapp 的后端组
upstream myapp {
server backend1.internal:8080;
server backend2.internal:8080;
server 10.0.0.7:8080 weight=3; # 权重:拿 3 倍流量
server 10.0.0.8:8080 backup; # 备用:主力全挂才上
}
# 引用:proxy_pass 到组名
server {
listen 80;
location / {
proxy_pass http://myapp;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
负载均衡策略
upstream myapp {
# 不写 = 轮询(round-robin),按 weight 加权
# least_conn; # 最少连接优先:后端处理时长不均时更好
# ip_hash; # 同一客户端 IP 固定到一台:简单的会话粘滞
# hash $cookie_sessionid; # 按任意键哈希:更精细的粘滞
server ...;
}
容错行为
upstream myapp {
server 10.0.0.7:8080 max_fails=3 fail_timeout=30s;
# 30 秒内失败 3 次 → 标记下线 30 秒,期间不再分发
}
配合 proxy_next_upstream(默认对 error/timeout 生效),某台后端超时时请求自动转给组内下一台——这就是 upstream 相对直接写死单台 proxy_pass http://单台 的核心价值。
单机也要用 upstream 吗?
值得。哪怕组里只有一台,upstream 也给了你:统一的命名(改后端地址只动一处)、后续加机器无缝扩展、max_fails 容错参数、以及日志里清晰的 upstream 维度变量($upstream_addr、$upstream_response_time、$upstream_status)。
观测云对照
upstream 维度是定位"哪台后端拖后腿"的关键切面。把 $upstream_addr $upstream_status $upstream_response_time 写进日志格式并接入观测云,在日志查看器里按 upstream 地址聚合延迟与错误率——组内某台机器变慢立刻现形;配合 APM 的全链路追踪,从 Nginx 入口到后端代码的耗时完整串联。
常见问题(FAQ)
Q:upstream 里能写域名吗?
A:能,但默认只在启动/reload 时解析一次 DNS,域名对应的 IP 变了不会自动更新。需要动态解析(如 K8s Service)时要用 resolver + 变量的写法。
Q:upstream 和直接 proxy_pass 到一台机器有什么区别?
A:功能上单台时几乎等价;区别在于 upstream 给了负载均衡、失败摘除、backup 机和 upstream 系列变量。生产环境建议一律走 upstream 块。
Q:怎么做灰度/按比例分流?
A:用 weight——比如新机 weight=1、老机 weight=9,10% 流量进新版本,验证稳定后逐步调平。