根据源ip转发至不同上游服务器

场景:由于重要会议护网行动,限制源地址访问,未在白名单里的源ip,返回系统维护静态页面

原架构


image.png

新架构


image.png

新架构可以通过Nginx 的map+upstream+proxy_pass组合来实现“根据不同源ip转发到不同上游服务器”

根据源 IP 转发到不同上游,Nginx配置

http {
    # 定义上游服务器组
    upstream backend_a {
        server 10.0.0.11:8080;
        server 10.0.0.12:8080;
    }

    upstream backend_b {
        server 10.0.0.10:8080;
    }

    # 提取 X-Forwarded-For 的第一个 IP,如果没有就用 remote_addr
    map $http_x_forwarded_for $real_client_ip {
        ~^(?<first_ip>[0-9\.]+),?.*$  $first_ip;
        default                       $remote_addr;
    }

    map $real_client_ip $backend_upstream {
        default   backend_b;
        158.34.168.98/29   backend_a;
        158.40.109.106     backend_a;
        158.40.109.105     backend_a;
    }

    server {
        listen 8899;

        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;
        }
    }

配置解析

1、map $http_x_forwarded_for $real_client_ip
   如果有多个 IP,取第一个((?<first_ip>[0-9\.]+))。
   如果没有 X-Forwarded-For,就用 $remote_addr。

2、map $real_client_ip $backend_upstream 
  获取变量real_client_ip值,也就是客户端真实ip,映射到不同upstream

3、注意
   这里为什么不用geo指令,geo 默认匹配的变量是客户端地址$remote_addr
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • """1.个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello ...
    她即我命阅读 12,734评论 0 6
  • 为了让我有一个更快速、更精彩、更辉煌的成长,我将开始这段刻骨铭心的自我蜕变之旅!从今天开始,我将每天坚持阅...
    李薇帆阅读 4,357评论 1 4
  • 似乎最近一直都在路上,每次出来走的时候感受都会很不一样。 1、感恩一直遇到好心人,很幸运。在路上总是...
    时间里的花Lily阅读 3,646评论 1 3
  • 1、expected an indented block 冒号后面是要写上一定的内容的(新手容易遗忘这一点); 缩...
    庵下桃花仙阅读 4,191评论 1 2
  • 一、工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)矩形、椭圆选框工具 【M】移动工具 【V...
    墨雅丫阅读 4,540评论 0 0

友情链接更多精彩内容