全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Nginx 实现灰度发布的三种方法总结

Nginx 实现灰度发布的三种方法总结

灰度发布的主要原理是访问路由的控制,重点是保证每次访问的是同一个节点。

方式一:通过调节负载均衡权重

        负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

        负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

简单配置如下:

http { 
  upstream cluster { 
    ip_hash; #如果你的系统中没有使用第三方缓存管理工具 ,建议使用此方式
    server 192.168.1.210:80 weight=5; 
    server 192.168.1.211:80 weight=3; 
    server 192.168.1.212:80 weight=1; 
  } 
  
  server { 
    listen 80; 
 
  location / { 
  
  proxy_next_upstream   error timeout;
  proxy_redirect     off;
  proxy_set_header    Host $host;
  #proxy_set_header    X-Real-IP $remote_addr;
  proxy_set_header    X-Real-IP $http_x_forwarded_for;
  proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
  client_max_body_size  100m;
  client_body_buffer_size 256k;
  proxy_connect_timeout  180;
  proxy_send_timeout   180;
  proxy_read_timeout   180;
  proxy_buffer_size    8k;
  proxy_buffers      8 64k;
  proxy_busy_buffers_size 128k;
  proxy_temp_file_write_size 128k;
  proxy_pass http://cluster; 
    } 
  } 
} 

这种方式灰度发布通过weight来实现,但是这种方式只适合修改节点的行为,而且要求应用都是一模一样的,其实质作用是,节点增加或删除之后,对负载能力的调节,最终目的是为了让流量最终保持均衡。

方式二.使用nginx+lua实现web项目的灰度发布

location / {
 content_by_lua '
      myIP = ngx.req.get_headers()["X-Real-IP"]
      if myIP == nil then
        myIP = ngx.req.get_headers()["x_forwarded_for"]
      end
      if myIP == nil then
        myIP = ngx.var.remote_addr
      end
      if myIP == "公司出口IP" then
        ngx.exec("@client")
      else
        ngx.exec("@client_test")
      end
    ';
} 

location @client{
  proxy_next_upstream   error timeout;
  proxy_redirect     off;
  proxy_set_header    Host $host;
  #proxy_set_header    X-Real-IP $remote_addr;
  proxy_set_header    X-Real-IP $http_x_forwarded_for;
  proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
  client_max_body_size  100m;
  client_body_buffer_size 256k;
  proxy_connect_timeout  180;
  proxy_send_timeout   180;
  proxy_read_timeout   180;
  proxy_buffer_size    8k;
  proxy_buffers      8 64k;
  proxy_busy_buffers_size 128k;
  proxy_temp_file_write_size 128k;
  proxy_pass http://client;

}
location @client_test{
  proxy_next_upstream   error timeout;
  proxy_redirect     off;
  proxy_set_header    Host $host;
  #proxy_set_header    X-Real-IP $remote_addr;
  proxy_set_header    X-Real-IP $http_x_forwarded_for;
  proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
  client_max_body_size  100m;
  client_body_buffer_size 256k;
  proxy_connect_timeout  180;
  proxy_send_timeout   180;
  proxy_read_timeout   180;
  proxy_buffer_size    8k;
  proxy_buffers      8 64k;
  proxy_busy_buffers_size 128k;
  proxy_temp_file_write_size 128k;
  proxy_pass http://client_test;
} 

由于使用了nginx+lua模块,这种方式适合很多场景,非常强大,但是问题是你可能需要学习很多lua的语法。

 方式三.使用http头信息判断+权重(灰度值)

http请求传输过程中,会自动带上User-Agent,Host,Referer,Cookie等信息。我们只需要判断ip地址段,用户代理,Cookie中的信息等。我们这里以Cookie为例。

当然,这里需要解决两个问题:

①首次访问静态页面可能不会产生cookie

②我们需要通过代码动态设置路由

③通过weight控制灰度值

我们可以通过一个例子来解决上述中的②与③的问题

upstream tts_V6 {
    server 192.168.3.81:5280 max_fails=1 fail_timeout=60;
}
upstream tts_V7 {
    server 192.168.3.81:5380 max_fails=1 fail_timeout=60;
}
upstream default {  #通过upstream default + weight节点控制权重
    server 192.168.3.81:5280 max_fails=1 fail_timeout=60 weight=5;
    server 192.168.3.81:5380 max_fails=1 fail_timeout=60 weight=1;
}
server {
    listen 80;
    server_name test.taotaosou.com;
    access_log logs/test.taotaosou.com.log main buffer=32k;
    #match cookie
    set $group "default";
    if ($http_cookie ~* "tts_version_id=tts1"){ #动态控制路由
        set $group tts_V6;
    }
    if ($http_cookie ~* "tts_version_id=tts2"){
        set $group tts_V7;
    }
    location / {            
        proxy_pass http://$group;
        proxy_set_header  Host       $host;
        proxy_set_header  X-Real-IP    $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        index index.html index.htm;
    }
 }

对于问题①,我们可以在index页面通过script来访问动态页面:

<script src="https://test.taotaosou.com/cookieinfo.php" /><script>

此外,我们还要在cookieinfo.php中判断和生成cookie

<?php

if(!session_id())
{
 session_start();
}
if(!isset($_COOKIE["tts_version_id"]))
{
 $cookieValue = $_SERVER['SERVER_PORT']==5280?"tts1":"tts2";
 setcookie("tts_version_id", $cookieValue, time()+3600, "/");
}
?>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Nginx  # 实现灰度发布  # 实现灰度发布的几种方法  # nginx+lua+redis 灰度发布实现方案  # Nginx实现灰度发布的常见方法小结  # 基于Nginx实现灰度发布的详细流程  # 使用Nginx实现灰度发布的使用  # Nginx与Lua灰度发布的实现  # Nginx实现前端灰度发布  # 我们可以  # 负载均衡  # 的是  # 都是  # 首次  # 多个  # 要在  # 可用性  # 希望能  # 三种  # 问题是  # 数据处理  # 或删除  # 只需要  # 为例  # 谢谢大家  # 第三方  # 来实现  # 过程中  # 是为了 


相关文章: 番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  Java解压缩zip - 解压缩多个文件或文件夹实例  营销式网站制作方案,销售哪个网站招聘效果最好?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  一键网站制作软件,义乌购一件代发流程?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  如何快速上传建站程序避免常见错误?  建站之星微信建站一键生成小程序+多端营销系统  建站之星安装失败:服务器环境不兼容?  建站主机选虚拟主机还是云服务器更好?  如何选择CMS系统实现快速建站与SEO优化?  SQL查询语句优化的实用方法总结  如何用免费手机建站系统零基础打造专业网站?  建站之星如何配置系统实现高效建站?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  建站之星后台管理系统如何操作?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  如何通过多用户协作模板快速搭建高效企业网站?  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  建站之星后台密码遗忘或太弱?如何重置与强化?  Swift开发中switch语句值绑定模式  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  PHP正则匹配日期和时间(时间戳转换)的实例代码  如何在Golang中指定模块版本_使用go.mod控制版本号  如何快速辨别茅台真假?关键步骤解析  网站制作服务平台,有什么网站可以发布本地服务信息?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  如何快速登录WAP自助建站平台?  h5在线制作网站电脑版下载,h5网页制作软件?  ui设计制作网站有哪些,手机UI设计网址吗?  如何选择高效响应式自助建站源码系统?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  广州营销型建站服务商推荐:技术优势与SEO优化解析  如何生成腾讯云建站专用兑换码?  如何在云虚拟主机上快速搭建个人网站?  IOS倒计时设置UIButton标题title的抖动问题  定制建站模板如何实现SEO优化与智能系统配置?18字教程  韩国服务器如何优化跨境访问实现高效连接?  如何快速生成高效建站系统源代码?  如何用已有域名快速搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。