Nginx proxy_pass 怎么配置多个 upstream 组的联动

梦婷小哥_7136

梦婷小哥_7136

2026-10-09

875人浏览

原创

nginx 的 proxy_pass 本身不支持一次请求在多个 upstream 间自动切换或联动,只能指向一个明确的 upstream 名称或具体地址;所谓“多个 upstream 联动”实为通过 if、map、location 匹配等机制实现条件路由,而非 proxy_pass 自身能力。

nginx proxy_pass 怎么配置多个 upstream 组的联动

Nginx 的 proxy_pass 本身不支持“一次请求自动在多个 upstream 间切换或联动”,它只能指向一个明确的 upstream 名称(如 http://api_backend)或具体地址(如 http://10.0.1.5:8080)。所谓“多个 upstream 的联动”,实际是指根据业务逻辑,在不同条件下将请求导向不同 upstream —— 这需要配合 if、map、location 匹配、变量赋值等机制来实现动态路由,而非 proxy_pass 自身具备多目标能力。

下面分几种典型联动场景说明配置要点:

根据域名或路径选择 upstream

这是最常用、最稳定的方式。每个 server 或 location 明确绑定一个 upstream:

upstream user_api { server 10.0.1.10:8080; server 10.0.1.11:8080; }
upstream order_api { server 10.0.2.20:8080; server 10.0.2.21:8080; }

server {
    listen 80;
    server_name api.example.com;

    location /user/ {
        proxy_pass http://user_api;
        proxy_set_header Host $host;
    }

    location /order/ {
        proxy_pass http://order_api;
        proxy_set_header Host $host;
    }
}

✅ 优点:配置清晰、无运行时开销、兼容所有 Nginx 版本
⚠️ 注意:proxy_pass 后的斜杠要与 location 匹配一致(如 location /user/ 对应 proxy_pass http://user_api/ 才能正确重写路径)

根据请求头或参数动态选 upstream

用 map 预定义变量,再在 proxy_pass 中引用:

map $http_x_service $backend {
    default           user_api;
    "order"           order_api;
    ~^v2              user_api_v2;
}

upstream user_api { server 10.0.1.10:8080; }
upstream order_api { server 10.0.2.20:8080; }
upstream user_api_v2 { server 10.0.1.12:8080; }

server {
    location /api/ {
        proxy_pass http://$backend;
        proxy_set_header Host $host;
    }
}

✅ 适合灰度发布、AB 测试、多版本路由
⚠️ 注意:map 必须在 http{} 级定义;变量值必须是已声明的 upstream 名称,不能拼接字符串

故障转移式联动(主备 fallback)

利用 proxy_next_upstream + 备用 upstream 的间接联动:

FastAPI Flask Proxy
FastAPI Flask Proxy

FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。

下载
upstream primary {
    server 10.0.1.10:8080 max_fails=3 fail_timeout=30s;
    server 10.0.1.11:8080 max_fails=3 fail_timeout=30s;
}

upstream fallback {
    server 10.0.2.20:8080 backup;
}

server {
    location / {
        proxy_pass http://primary;
        proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
        proxy_next_upstream_tries 2;
        # 注意:Nginx 不支持直接 fallback 到另一个 upstream,
        # 但可把 fallback server 加进 primary 并标为 backup
    }
}

✅ 真实可行,符合 Nginx 原生机制
⚠️ 不是“两个 upstream 切换”,而是同一 upstream 内部的主备调度;若真需跨组 fallback,需用 Lua(OpenResty)或外部网关

不推荐的做法:用 if + proxy_pass 动态拼接

# ❌ 错误示例(if 在 location 中限制多,且 proxy_pass 不支持变量拼接上游名)
if ($arg_env = "prod") {
    set $upstream "prod_api";
}
proxy_pass http://$upstream;  # 这会报错:“invalid URL prefix”

Nginx 官方明确不建议在 if 中使用 proxy_pass,且变量不能用于解析 upstream 名(除非启用 resolver + DNS 方式,见下文补充)。

补充:DNS 解析方式实现“软联动”

当多个服务注册到同一个域名(如 backend.service.consul),可通过 DNS 轮询+健康发现间接联动:

resolver 127.0.0.11 valid=5s;
upstream dynamic_group {
    server backend.service.consul:8080 resolve;
}

server {
    location / {
        set $target "backend.service.consul:8080";
        proxy_pass http://$target;
    }
}

✅ 适用于 Consul/Eureka/CoreDNS 等服务发现场景
⚠️ 实际仍是单个 upstream,只是后端 IP 动态变化;不等于“多个 upstream 协同决策”

本质上,Nginx 的设计哲学是 静态配置 + 运行时高效转发,不是动态策略引擎。真正复杂的联动逻辑(如按用户 ID 分片到 A 组、按订单金额路由到 B 组、失败后重试 C 组),应交由上游网关(如 Kong、Traefik)、Sidecar(Istio)、或嵌入 Lua 脚本(OpenResty)来处理。

不复杂但容易忽略

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

437

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

900

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

2772

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

936

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

829

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

414

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

2516

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

4652

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

747

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习