场景:由于重要会议护网行动,限制源地址访问,未在白名单里的源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