基于Nginx实现灰度发布的实现方案

灰度发布(又称金丝雀发布)是指在黑与白之间能够平滑过渡的一种发布方式。在其上可以进行A/B 测试,先让让一部分用户继续用产品特性A,另一部分用户开始用产品特性B,如果特性B没有什么问题,那么逐步扩大范围,把所有用户都迁移到B上面来。

灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度,目前国内的很多大厂都在使用灰度发布方式。下面介绍几种通过Nginx实现的灰度发布的方案。

1、基于Nginx的权重实现方案

首先将服务器A下线(从Nginx的服务列表中剔除),运维人员通过Jenkins一键发布最新的代码到服务器A上,代码发布成功之后运维人员开始配置Nginx,配置Nginx核心就是配置Nginx的upstream这块,如下图所示的Nginx配置:

upstream webservers { 
      server 192.168.201.121 weight=90; 
      server 192.168.201.120 weight=10; 
} 
server { 
      listen   80; 
      location / { 
          proxy_pass http://webservers 
      } 
}

值得注意的是权重值没有限定,如果weight的值设置的越大,那么这台服务器分配的流量就越高。通过上面的配置就可以实现对服务器A的灰度发布了,运维人员执行Nginx的重新加载配置命令将新的Nginx配置生效。此时将会有90%的流量分配到服务器B上,10%的流量分配到服务器A上。

如果新版本验证没有问题了,那么可以逐步将流量放到服务器A上。随后可以采用同样的方式升级服务器B。这种实现灰度发布的方式比较简单,Nginx自带的功能就可以实现。

2、基于客户端请求的方式

首先下掉服务器A,运维人员一键发布最新的代码到服务器A上,随后运维人员配置Nginx配置文件来处理客户端请求到底是要发送到哪个服务器上。Nginx的配置文件中的核心配置如下所示:

upstream webservers { 
      server 192.168.201.121; 
} 
#新版本的服务器配置 
upstream webservers-newweb { 
      server 192.168.201.120; 
} 
server { 
      listen   80; 
      set $backend "webservers"; 
#判断请求中是否存在特点的标识,如果存在特点的标识就转发服务器A 
      if ($http_cookie~*"A=a") {   
        set $backend="webservers-newweb" 
      } 
      location / { 
# 根据上面的$backend参数值转发到对应的服务器上 
          proxy_pass http://$backend 
      } 
}

基于客户端请求是Nginx通过获取客户端携带的Cookie或者Http请求头指定的键值对(如A=a键值对)将流量转发到新版本上(服务器A),如果新版本测试通过,那么可以将全部流量或者部分流量切换到新版上,这种策略比较适合特定的用户或者客户端访问新的版本。

总结:

以上的两种方式都是基于Nginx来实现,实现过程也是不复杂的。如果希望某一群体的用户使用新版本,那么此时可以通过基于客户端请求的方式来实现灰度发布;如果只是单纯的线上验证新版本,那么可以通过基于权重的方式实现灰度发布。

3