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;

    # 获取用户真实IP
    set_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;
    }
    
    # 测试用户访问获取用户IP
    location /iptest {
        return 200 $remote_addr;
    }
}

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

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

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

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

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法===优先队列

文章目录 前言一、优先队列二、应用场景三、代码实现总结 前言 之前写过很多数据结构与算法相关的了,今天看一个新的数据结构,优先队列。优先队列类似队列,却又优先于队列,是堆实现的。接下来详细看看。 一、优先队列 优先队列一…

STL库简介

一、STL库的概念 STL:是C标准库的重要追组成部分,不仅是一个可以复用的组件库,而且还是一个包含了数据结构和算法的软件框架。 二、STL的版本 原始版本 Alexander Stepanov、 Meng Lee 在惠普实验室完成的原始版本, 是一个开源…

C语言错题本之<结构体>

以下叙述中正确的是________. A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令 C)宏名必须用大写字母表示 D)宏替换不占用程序的运行时间 答案:D 解析: A:在C、C等编程语言中,预处理指令(…

【PB案例学习笔记】-02 目录浏览器

写在前面 这是PB案例学习笔记系列文章的第二篇,该系列文章适合具有一定PB基础的读者, 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码,小凡都上…

RS编码和卷积码总结

RS编码 简要介绍RS编码及其原理 1. RS编码简介 Reed-Solomon编码(RS编码)是一种强大的纠错码,广泛应用于数据存储和传输中。RS编码由Irving S. Reed和Gustave Solomon于1960年提出,属于BCH码的一种,是基于有限域&am…

杨校老师项目之基于单片机STC89C52的智能环境监测系统【嵌入式】

获取全套资料: 有偿获取:mryang511688 技术:C语言、单片机等 摘要: 此设计可分为三个主要部分。此中的温度和湿度的检测功能,通过操纵单总线型温湿度传感器DHT11以数字形式显示,实现了切确测得温湿度的功能…

五分钟“手撕”时间复杂度与空间复杂度

目录 一、算法效率 什么是算法 如何衡量一个算法的好坏 算法效率 二、时间复杂度 时间复杂度的概念 大O的渐进表示法 推导大O阶方法 常见时间复杂度计算举例 三、空间复杂度 常见时间复杂度计算举例 一、算法效率 什么是算法 算法(Algorithm):就是定…

蓝桥杯单片机之模块代码《串口发数据》

过往历程 历程1:秒表 历程2:按键显示时钟 历程3:列矩阵按键显示时钟 历程4:行矩阵按键显示时钟 历程5:新DS1302 历程6:小数点精确后两位ds18b20 历程7:35定时器测量频率 历程8&#xff…

队列的讲解

队列的概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 一端进另一端出 也就是可以做到,先…

[BJDCTF 2020]easy_md5、[HNCTF 2022 Week1]Interesting_include、[GDOUCTF 2023]泄露的伪装

目录 [BJDCTF 2020]easy_md5 ffifdyop [SWPUCTF 2021 新生赛]crypto8 [HNCTF 2022 Week1]Interesting_include php://filter协议 [GDOUCTF 2023]泄露的伪装 [BJDCTF 2020]easy_md5 尝试输入一个1,发现输入的内容会通过get传递但是没有其他回显 观察一下响应…

数据结构与算法-排序算法3-插入排序

目录 1.插入排序: 1.介绍: 2.动态图解 3.举例 4.小结插入排序规则 5.插入排序代码 6.运行时间 代码: 运行结果: 1.插入排序: 1.介绍: 数组中n个元素,把这n个待排序元素看成一个有序序…

深度学习:光流估计新范式

0.概述 在这篇文章中,我们将讨论两种基于深度学习的光流运动估计方法。FlowNet是第一个用于计算光流的CNN方法,RAFT是当前最先进的估计光流的方法。我们还将看到如何使用作者提供的经过训练的模型来使用PyTorch对新数据进行推断。 1. FlowNet FlowNet…

读人工智能时代与人类未来笔记03_演变

1. 演变 1.1. 每个社会都找到了属于自己的一套适应世界的方法 1.1.1. 适应的核心,是有关人类心智与现实之间关系的概念 1.1.2. 人类认识周围环境的能力 1.1.2.1. 这种能力通过知识获得,同时也受到知识…

CentOS 安装 SeaweedFS

1. SeaweedFS 介绍 SeaweedFS 是一个简单且高度可扩展的分布式文件系统。有两个目标: to store billions of files! (存储数十亿个文件!)to serve the files fast! (快速提供文件!) Seaweedfs的中心节点(center master&#xff09…

电容笔记汇总

电容 一、电容理论基础 1、电容的本质 两个相互靠近的导体,中间夹一层不导电的绝缘介质,这就构成了电容器。当电容器的两个极板之间加上电压时,电容器就会储存电荷。 两个相互靠近的金属板中间夹一层绝缘介质组成的器件,当两端…

JeeSite Vue3:前端开发页面如何动态设置菜单展示模式?

推荐阅读: JeeSite Vue3:前端开发的未来之路(更新版) 随着技术的飞速发展,前端开发技术日新月异。在这个背景下,JeeSite Vue3 作为一个基于 Vue3、Vite、Ant-Design-Vue、TypeScript 和 Vue Vben Admin 的前端框架,引…

研发管理之认识DevOps

文章目录 一、什么是DevOps二、DevOps的背景和起源三、DevOps的特点和价值1、特点:2、价值: 四、DevOps如何帮助提高软件交付速度和质量 一、什么是DevOps DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称…

Sketch总结

sketch禁用了lineGap https://www.sketch.com/docs/designing/text/ http://www.sketchcn.com/sketch-chinese-user-manual.html https://github.com/sketch-hq/sketch-document https://developer.sketch.com/file-format/ https://animaapp.github.io/sketch-web-viewer/ htt…

Python | Leetcode Python题解之第89题格雷编码

题目&#xff1a; 题解&#xff1a; class Solution:def grayCode(self, n: int) -> List[int]:ans [0] * (1 << n)for i in range(1 << n):ans[i] (i >> 1) ^ ireturn ans

C++基础与深度解析 | 表达式 | 操作符

文章目录 一、表达式基础1.表达式的值类别2.表达式的类型转换 二、表达式详述1.算术操作符2.逻辑与关系操作符3.位操作符4.赋值操作符5.自增与自减运算符6.其他操作符三、C17对表达式的求值顺序的限定 一、表达式基础 表达式由一到多个操作数组成&#xff0c;可以求值并 ( 通常…