Nginx 里的 upstream 是什么意思?

upstream 是 Nginx 里"后端服务器组"的抽象:upstream 块定义一组后端供 proxy_pass 引用,自带负载均衡(轮询/权重/ip_hash)、健康摘除;概念、示例与 FAQ。

最佳实践
Nginx 里的 upstream 是什么意思?封面

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% 流量进新版本,验证稳定后逐步调平。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台