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小时内与您取得联系。