如何利用 map 指令实现基于请求来源 IP 的特定 Upstream 后端路由方案

秋涛同学_6722

秋涛同学_6722

2026-05-22

729人浏览

原创

nginx 的 map 指令是实现基于来源 ip 动态路由最灵活、低侵入的方式,通过 geo 模块匹配 ip 段并映射为 upstream 名称变量,再在 proxy_pass 中引用该变量完成动态转发,推荐配合 realip 获取真实客户端 ip 并注意变量命名与 upstream 严格一致。

如何利用 map 指令实现基于请求来源 ip 的特定 upstream 后端路由方案

Nginx 的 map 指令是实现基于来源 IP 动态路由最灵活、低侵入的方式之一。它不依赖第三方模块,原生支持,且可与 geo、realip 等模块配合,在真实业务中广泛用于灰度发布、地域调度、内外网隔离等场景。

核心思路是:把客户端 IP 映射为一个变量(如 $upstream_name),再在 proxy_pass 中引用该变量,指向对应 upstream 块。


一、基础配置:用 geo + map 绑定 IP 段到 upstream 名称

`geo` 模块适合做 CIDR 匹配(如内网段、特定机房 IP),比纯正则更高效:
# 在 http 块顶层定义
geo $client_network {
    default        0;
    10.0.0.0/8     1;  # 内网 A 段
    172.16.0.0/12  2;  # 内网 B 段
    192.168.0.0/16 3;  # 内网 C 段
    203.0.113.10   4;  # 某个测试公网 IP
}

map $client_network $backend_upstream {
    default        "prod_backend";
    1              "intranet_a_backend";
    2              "intranet_b_backend";
    3              "intranet_c_backend";
    4              "test_backend";
}

这样,每个 IP 段被映射为一个字符串值,后续可直接用于 proxy_pass http://$backend_upstream。


二、进阶用法:结合 realip 获取真实客户端 IP

若 Nginx 前有 CDN 或 LB,需先还原真实 IP,否则 `$remote_addr` 是代理地址:
# 在 http 块中启用 realip(假设可信代理为 10.10.0.0/16)
set_real_ip_from 10.10.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;

# 此时 $remote_addr 已更新为真实客户端 IP
geo $is_internal_ip {
    default        0;
    10.0.0.0/8     1;
    172.16.0.0/12  1;
    192.168.0.0/16 1;
}

map $is_internal_ip $backend_upstream {
    0 "public_backend";
    1 "internal_backend";
}

注意:X-Forwarded-For 头可能被伪造,务必只信任已知代理 IP 段,并开启 real_ip_recursive on 安全解析。

Skill Weave Chains — 技能链路由引擎
Skill Weave Chains — 技能链路由引擎

开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。

下载

三、动态 proxy_pass 的关键写法

在 `location` 块中使用变量名拼接 upstream,必须确保变量值**严格等于 upstream 块名称**(含大小写、下划线):
upstream internal_backend {
    server 10.0.1.10:8080;
    server 10.0.1.11:8080;
}

upstream public_backend {
    server 10.0.2.20:8080;
    server 10.0.2.21:8080;
}

server {
    listen 80;
    location / {
        proxy_pass http://$backend_upstream;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

⚠️ 注意事项:

  • 变量不能带引号,proxy_pass http://$backend_upstream; ✅;proxy_pass "http://$backend_upstream"; ❌(语法错误)
  • upstream 名称中避免空格、短横线(-),推荐全小写+下划线
  • 若变量为空或未匹配,Nginx 会报 no resolver defined to resolve ... 错误,建议 default 值设为稳定可用的 upstream

四、替代方案对比:map vs if + geo vs rewrite

| 方式 | 是否推荐 | 原因 | |------|----------|------| | `map` + `geo` | ✅ 强烈推荐 | 编译期构建查找表,性能高;逻辑清晰;支持嵌套和默认兜底 | | `if ($remote_addr ~ ...) { set $upstream ... }` | ⚠️ 不推荐 | `if` 在 location 外不安全;正则匹配开销大;易出错 | | `rewrite ... break` 配合不同 location | ❌ 不适用 | 路由逻辑分散,维护成本高,无法复用 upstream |

map 是声明式、无副作用、可静态验证的最佳实践。

不复杂但容易忽略细节

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

路由 stream

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

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2603

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6650

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6086

10

服务器是什么
服务器是什么

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

2023.08.15

457

5

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

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

2023.09.08

940

5

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

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

2023.09.19

3112

5

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

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

2023.10.09

1036

5

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

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

2023.10.17

929

5

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

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

2023.10.17

474

3

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
零基础精通 PS 视频教程
零基础精通 PS 视频教程

共268课时 | 120.1万人学习

前端工程师必备技能—PS切图
前端工程师必备技能—PS切图

共11课时 | 2.2万人学习

麦子学院Photoshop切片视频教程
麦子学院Photoshop切片视频教程

共13课时 | 4.3万人学习