Nginx生产环境最佳实践之配置灰度环境

在这里插入图片描述

你好呀,我是赵兴晨,文科程序员。

下面的内容可以说是干货满满建议先收藏再慢慢细品。

今天,我想与大家深入探讨一个我们日常工作中不可或缺的话题——灰度环境。你是否在工作中使用过灰度环境?如果是,你的使用体验如何?

俗话说得好:“不想成为架构师的Java程序员,不是一个好的SRE。(Site Reliability Engineer,即网站可靠性工程师)”这句话看似是一句玩笑话,但是它道出了一个程序员不断追求技术深度与广度的重要性。

在日常工作中,我们不仅要精通Java,还需要掌握运维和前端技术等多方面技能,而灰度环境的构建与管理正是其中的关键一环。

那么什么是灰度发布呢?

灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB Test 就是一种灰度发布。 让一部分用户继续使用环境A, 一部分用户开始使用环境B,如果用户对环境B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到环境B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现问题并及时调整,以保证其小范围的影响度。

常见的灰度发布的方式

Nginx + Lua 实现灰度

这个说来话长,涉及到的内容太多,我在做技术选型的时候直接给这个方案pass掉了,这里就不做过多赘述。

基于 cookie 实现灰度

根据查询cookie键为version的值,如果cookie值为gray,则转发到linux_gray(灰度环境),cookie的值都不匹配的情况下,默认走linux_prod(生产环境)。

举个例子:

两个后端应用服务器分别定义为

# 灰度环境
linux_gray 10.0.0.60:10001# 生产环境
linux_prod 10.0.0.61:10001

使用map指令实现

在Nginx里面配置一个映射,$COOKIE_version 可以解析出Cookie 里面的 version 字段, $group 是一个变量, {} 里面是映射规则。

如果一个 version为gray 的用户来访问,$group 就等于linux_gray。在 server 里面使用就会代理到http://linux_gray 上。

否则,$group 就等于 linux_prod。在 server 里面使用就会代理到 http://linux_prod 上。Cookie 值都不匹配的情况下默认走 linux_prod 所对应的服务器。

以下👇是基于cokkie实现灰度的Nginx配置参考。

# 灰度环境
upstream  linux_gray {server    10.0.0.60:10001;
}# 生产环境
upstream  linux_prod {server    10.0.0.61:10001;
}# 后端服务
map $COOKIE_version $group {~*gray$ linux_gray;default linux_prod;
}# 前端静态资源
map $COOKIE_version $grouppath {~*gray$ /web/staticGray/;default /web/staticProd/;
}server {listen 80;server_name linuxtest.com;access_log logs/linux.log main;# 后端服务location /server/test { # 进入灰度环境增加响应标识if ( $COOKIE_version ~* "gray$" ){add_header version gray always;}# rewrite解决 /test丢失问题rewrite ^/server/(.*) /$1 break;proxy_pass http://$group;}# 静态资源location /serverweb {if ( $COOKIE_version ~* "gray$" ){add_header version gray always;}alias $grouppath;try_files $uri $uri/ /index.html;index index.html;}
}

根据用户访问的IP 实现灰度

nginx 对用户的IP进行分流,将符合分流规则的用户IP指到linux_gray(灰度环境),其余的指到 linux_prod(生产环境)

举个例子:

两个后端应用服务器分别定义为

# 灰度环境
linux_gray 10.0.0.60:10001# 生产环境
linux_prod 10.0.0.61:10001

跟cookie的差不多 也是使用map指令实现的,但需要获取用户的真实IP地址。

# 灰度环境
upstream  linux_gray {server    10.0.0.60:10001;
}# 生产环境
upstream  linux_prod {server    10.0.0.61:10001;
}# 后端服务
map $remote_addr $group {# 只允许用户ip为10.0.0.75的用户访问灰度环境# 也可以设置成ip段 ~*^10\.0\.0\.(.*?)$~10.0.0.75 linux_gray;default linux_prod;
}# 前端静态资源
map $remote_addr $grouppath {~10.0.0.75 /web/staticGray/;default /web/staticProd/;
}server {listen 80;server_name linuxtest.com;access_log logs/linux.log main;# 获取用户真实IPset_real_ip_from 127.0.0.1; # 真实服务器上一级代理的IP地址或者IP段,可以写多行real_ip_header  X-Forwarded-For; # 从哪个header头检索出要的IP地址real_ip_recursive on; #递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP# 后端服务location /server/test { # 进入灰度环境增加响应标识if ( $remote_addr ~* "10.0.0.75" ){add_header version gray always;}# rewrite解决 /test丢失问题rewrite ^/server/(.*) /$1 break;proxy_pass http://$group;}# 静态资源location /serverweb {if ( $remote_addr ~* "10.0.0.75" ){add_header version gray always;}alias $grouppath;try_files $uri $uri/ /index.html;index index.html;}# 测试用户访问获取用户IPlocation /iptest {return 200 $remote_addr;}
}

上面这三种方案就是当时我做技术选型能够搜集到的方案, 基于cookie实现灰度会出现好多问题,不太符合现有系统:

1、获取cookie的时机问题,如默认用户第一次进入到系统,需要判断该用户是否是灰度用户,如果是灰度用户下次请求会携带cookie,这样前端静态资源第一次进入到的是生产环境,需要重新刷新才能进入到灰度环境,对用户不太友好。

2、如果灰度环境出现问题,需要回滚,回滚后无法保证用户实时切换回生产环境,因为只有用户登录的时候才会确定该用户是否是灰度用户,如果灰度用户在使用中,没有重新登录,会一直在灰度环境,除非强制将用户踢下线,提示用户重新登录,这样对用户体验也不友好。

所以基于以上的两个问题,最终决定选用基于用户IP来实现灰度发布。

基于用户IP实现灰度的核心所在是获取用户真实IP,并根据用户的真实IP特征来决定进入灰度的规则,IP规则可以是IP段。

以上就是我个人的一些思考,如果有不正确的地方,欢迎大家在文章底部留言指正。

如果你是第一次接触Centos7、Nginx建议看一下我之前的文章:

扫描下方👇二维码关注我,可查看相关知识点干货!

最后,我想说的是:点赞和分享不仅仅是一种美德,更是对未来美好生活的投资。愿每一个点在看的朋友,未来都能收获满满的幸福和成功!

你好,我是赵兴晨,一名文科程序员。我期待在文章下方看到你的留言,让我们一起交流,共同进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/12431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI图像生成-基本步骤

模型板块 1、新建采样器:新建节点-》采样器-》K采样器 2、拖动模型节点后放开,选择checkpoint加载器(简易),模型新建成功 提示词板块 1、拖动正面条件节点后放开,选择CLIP文本编码器,模型新建…

mysql 一次删除多个备份表

show tables时,发现备份的表有点多,想要一个sql就删除 总不能drop table xx ; 写多次吧。 方式一 1.生成删除某个数据库下所有的表SQL -- 查询构建批量删除表语句(根据数据库名称) select concat(drop table , TABLE_NAME, ;)…

代码随想录算法训练营第39天|● 62.不同路径 ● 63. 不同路径 II

62. 不同路径 递归栈很酷 但超时 class Solution:def uniquePaths(self, m: int, n: int) -> int:if m1 or n1:return 1return self.uniquePaths(m-1,n)self.uniquePaths(m,n-1) 逐行dp class Solution:def uniquePaths(self, m: int, n: int) -> int:dp[1]*nfor j in…

FSMC的NOR Flash/PSRAM 控制器功能介绍(STM32F4)

目录 概述 1 FSMC支持的类型 1.1 信号类型概述 1.2 FSMC的应用 2 外部存储器接口信号 2.1 I/O NOR Flash 2.2 PSRAM/SRAM 3 支持的存储器和事务 4 通用时序规则 5 NOR Flash/PSRAM 控制器异步事务 5.1 模式 1 - SRAM/PSRAM (CRAM) 5.2 模式 A - SRAM/PSRAM (CRAM…

Golang | Leetcode Golang题解之第90题子集II

题目&#xff1a; 题解&#xff1a; func subsetsWithDup(nums []int) (ans [][]int) {sort.Ints(nums)n : len(nums) outer:for mask : 0; mask < 1<<n; mask {t : []int{}for i, v : range nums {if mask>>i&1 > 0 {if i > 0 && mask>&…

[HUBUCTF 2022 新生赛]ezsql

测试无结果 扫描目录&#xff0c;得到源码 找到注入点 思路&#xff1a;更新资料的时候可以同时更新所有密码 我们需要知道密码的字段名 爆库 nicknameasdf&age111,description(select database())#&descriptionaaa&token31ad6e5a2534a91ed634aca0b27c14a9 爆表…

运维别卷系列 - 云原生监控平台 之 08.prometheus grafana 实践

文章目录 [toc]部署 Grafana准备配置文件grafana.iniprovisioning/datasources/prometheus.yamlprovisioning/dashboards/dashboards.yamlprovisioning/dashboards/views 创建 svc创建 deployment Grafana 是一个图形化界面&#xff0c;配置 Prometheus 作为数据源&#xff0c;…

网络库-POCO介绍

1.简介 POCO C Libraries 提供一套 C 的类库用以开发基于网络的可移植的应用程序&#xff0c;它提供了许多模块&#xff0c;包括网络编程、文件系统访问、线程和并发、数据库访问、XML处理、配置管理、日志记录等功能。Poco库的设计目标是易于使用、高度可定制和可扩展。 包含…

Postman的简介,安装,注册。

一、安装 1.Chrome应用商品搜索Postman安装。(翻墙) 2.客户端安装官网地址:https://www.postman.com/downloads/ 3.Postman的注册和登录。 4.Postman的界面介绍 Home主页 workspaces 工作空间 Collections 集合&#xff0c;项目集合。 Apis api文档 EnViromments …

Oracle如何加密解密sha256

在Oracle数据库中&#xff0c;您可以使用内建的加密函数或者通过PL/SQL扩展来实现SHA-256加密。但请注意&#xff0c;SHA-256是一个哈希算法&#xff0c;它主要用于生成数据的哈希值&#xff0c;而不是用于加密和解密数据。哈希算法是单向的&#xff0c;即它只能从原始数据生成…

基于MSWA相继加权平均的交通流量分配算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于MSWA相继加权平均的交通流量分配算法matlab仿真.如图所示交通网络中&#xff0c;包含6个节点、11各路段、9个OD对。经枚举可得每个OD对间存在3条无折返有效路…

elasticsearch使用Ngram实现任意位数手机号搜索

文章目录 Ngram自定义分词案例实战问题拆解 Ngram分词器定义Ngram分词定义Ngram分词示例Ngram分词应用场景 Ngram分词实战 Ngram自定义分词案例 当对keyword类型的字段进行高亮查询时&#xff0c;若值为123asd456&#xff0c;查询sd4&#xff0c;则高亮结果是&#xff1c;em&a…

python项目连接数据库(mysql,postgresql)

在实际开发过程中&#xff0c;对于项目的数据查询和数据统计&#xff0c;那python是相当好用&#xff0c;相信很多后端工程师是java语言入门的&#xff0c;对于python呢是有一点陌生&#xff0c;我自己也是&#xff0c;不过当你操作起来呢发现其实还是蛮好上手的。以下就是一些…

C语言基础-标准库函数

C语言的标准库函数是由C语言标准库&#xff08;如C99、C11等&#xff09;提供的一系列预定义函数&#xff0c;这些函数通常用于执行常见的编程任务&#xff0c;如字符串操作、内存管理、数学计算、文件操作等。通过使用标准库函数&#xff0c;程序员可以更加高效地编写C语言程序…

在ubuntu上创建WiFi热点

要在 wlan0 无线网卡上发射热点&#xff08;即创建 WiFi 热点&#xff09;&#xff0c;可以使用 hostapd 和 dnsmasq 这两个工具。hostapd 用于创建热点&#xff0c;而 dnsmasq 用于提供 DHCP 和 DNS 服务&#xff0c;以便连接到热点的设备可以获取 IP 地址并访问互联网。 下面…

【AI】DeepStream(03):deepstream_test1_app

1、简介 deepstream-test1:演示各种 DeepStream 插件构建 GStreamer 管道。从文件中获取视频、解码、批处理,然后进行对象检测,最后在屏幕上渲染框。 源码路径:/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test1 先看下效果 2、编译 1)…

Qt将ffmpeg解码出来的数据保存为文件

具体代码如下: QImage image(m_pAVPicture.data[0], m_videoWidth, m_videoHeight, QImage::Format_RGB888);QString currrentTime = QDateTime::currentDateTime().

重写muduo网络库之调用流程的梳理

目录 1、流程叙述 2、我们看看TcpServer的构造都做了什么&#xff1f; 3、start() 3.1 开启loop 3.2 连接的建立 3.3 数据的收发 4、连接的关闭 muduo网络库各组件梳理见此博客 重写muduo库之组件梳理 1、流程叙述 首先&#xff0c;我们是怎么使用的&#xff1f; 1.定…

MTP协议中文翻译第一二三四章

1 简介 ​ 媒体传输协议(MTP)是一种协议,旨在与瞬态存储设备进行内容交换以及命令和控制。它是作为PTP或图像传输协议的扩展而开发的,主要针对便携式数码相机媒体播放器和手机。 1.1 目标 ​ 这个协议的主要目的是促进具有瞬时连接性和显著存储容量的媒体设备之间的通信…

【iOS】工厂模式

文章目录 前言设计模式的三大原则简单工厂模式工厂方法模式抽象工厂模式关于三兄弟的升级与降级注意 前言 上文讲完了iOS的架构模式&#xff0c;接下来聊一聊设计模式&#xff0c;设计模式有许多&#xff0c;主要介绍一下工厂模式 设计模式的三大原则 S 单一职责原则 告诉我…