0
点赞
收藏
分享

微信扫一扫

Nginx实现白名单灰度发布

曾宝月 2022-05-01 阅读 126

前言

很多时候项目上线,需要进行一次生产测试,但是呢又不想用户访问最新的接口服务,看到最新的内容。于是需要有一个叫白名单的家伙来控制流量。

具体实现方式呢,有很多种,在介绍nginx实现之前,先说说大致的方案。

方案一

后台控制
  1. 后台写白名单配置文件,如果是那种配置中心的服务架构,那么这种情况不需要重启服务干预,它会自动获取白名单用户,那么也唯有白名单用户才能访问最新的服务,其他用户则无感知。

  2. 反过来如果没有配置中心,那么会出现情况:每增删白名单一次,就需要重启服务一次才能生效,很显然这种办法不是很灵活。

  3. 再来一种就是客户端版本控制,也就是说新服务需要指定的客户端版本才能访问,惯例最新版本,那么内测人员可以升级成最新客户端版本,而其他用户则没有升级提示也就无法访问。

  4. 还有一种吗?有就是接下来要做事情,通过nginx来控制。

方案二

  1. 同过ip策略来限制分流,也就是说只有指定的ip才能访问,但是这个做法需要第三个节点来控制

image.png

第一个问题,ip来自哪里?

a> 数据库,如果我们会记录用户常用的ip地址,那么就可以筛选一批出来,当然目前而言可能很多情况ip都是动态发生改变的。

b> 限制内网就可以,也就是说上线后,只允许公司网络访问新服务,而要访问旧服务就需要自己切换自己的流量。

第二个问题,验证完之后呢?

a> C节点需要释放,或者放开ip限制;总归是需要操作nginx两次。

b> 可以不用释放,在做服务器容灾的时候,当其他节点服务器崩溃,可以迅速启用备用服务器,保证用户能正常访问。

# 定义两个服务节点

upstream myservername{

# ip_hash;

server 127.0.0.1:9100; # 不一定是本机,而是其他服务器的内网地址

server 127.0.0.1:9102;

}

server {

listen 80;

server_name localhost;


location / {

# ()不要靠着if,假设远程调用服务ip地址,等于 192.168.2.188,则重定向到http://$host/jforum;否则继续访问当前/根路径协议页面

if ( $remote_addr = '192.168.2.188' ){

rewrite ^/(.*)$ http://$host/jforum permanent;

}

root /data/www/html/dist/flaget;

index index.html index.htm;

try_files $uri $uri/ /index.html;

}


# 正常nginx本地访问localhost/
jforum即可

location ^~ /jforum {

proxy_pass http:/
/127.0.0.1:8080; # 这是第三个服务节点

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header Http-referer $http_referer;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

效果演示

image.png

image.png

set $myservername 127.0.0.1:9100;

# 这样设置,也就是排除本机

if ($remote_addr != '192.168.2.188'){

set $myservername 127.0.0.1:8080;

}

# 其他ip的客户端访问就会正常,本机访问服务器异常

location ^~/jforum {

proxy_pass http://$myservername; # 这个意思就更简单了,如果前面的if条件判断正确了,那么$myservername 就是新值,否则不变。

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header Http-referer $http_referer;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

总结

  1. nginx还有很多功能需要不断学习和实践,才能掌握它的强大;

  2. 在多年之前也有接触过关于白名单的设置,那时总觉得太遥远,才没有虚心向运维大佬请教。

举报

相关推荐

0 条评论