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

news2024/12/22 20:29:27

在这里插入图片描述

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

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

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

俗话说得好:“不想成为架构师的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建议看一下我之前的文章:

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

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

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

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

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

相关文章

flutter开发实战-compute将工作交由isolate处理

flutter开发实战-compute将工作交由isolate处理 最近查看flutter文档时候,看到了compute可以将工作交由isolate处理。通过 Flutter 提供的 compute() 方法将解析和转换的工作移交到一个后台 isolate 中。这个 compute() 函数可以在后台 isolate 中运行复杂的函数并…

Leetcode 第 129 场双周赛题解

Leetcode 第 129 场双周赛题解 Leetcode 第 129 场双周赛题解题目1:3127. 构造相同颜色的正方形思路代码复杂度分析 题目2:3128. 直角三角形思路代码复杂度分析 题目3:3129. 找出所有稳定的二进制数组 I思路代码复杂度分析 题目4:…

JavaScript异步编程——11-异常处理方案【万字长文,感谢支持】

异常处理方案 在JS开发中,处理异常包括两步:先抛出异常,然后捕获异常。 为什么要做异常处理 异常处理非常重要,至少有以下几个原因: 防止程序报错甚至停止运行:当代码执行过程中发生错误或异常时&#x…

数字人解决方案——ID-Animator可保持角色一致生成视频动画

一、引 言 个性化或自定义生成在图像和视频生成领域是一个不断发展的研究方向,尤其是在创建与特定身份或风格一致的内容方面。您提到的挑战和解决方案为这一领域提供了有价值的见解: 训练成本高:这是一个普遍问题,因为个性化生成…

手机触控面板中应用的电容式触摸芯片

手机触控屏(Touch panel)又称为触控面板,是个可接收触头等输入讯号的感应式液晶显示装置,当接触了屏幕上的图形按钮时,屏幕上的触觉反馈系统可根据预先编程的程式驱动各种连结装置,可用以取代机械式的按钮面…

【AI】DeepStream(03):deepstream_test1_app

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

Redis-分片集群存储及读取数据详解

文章目录 Redis分片集群是什么?Redis分片集群的存储及读取数据? 更多相关内容可查看 Redis分片集群是什么? Redis分片集群是一种分布式部署方式,通过将数据分散存储在多个Redis节点上,从而提高了系统的性能、扩展性和…

【微记录】linux内核态日志如何持续观测?以及dmesg如何显示年月日时间戳?(dmesg -w ; -T)

文章目录 持续观测方法1方法2 dmes显示时间戳 持续观测 方法1 dmesg -w参考:https://man7.org/linux/man-pages/man1/dmesg.1.html 方法2 tail -f /var/log/kern.logdmes显示时间戳 dmesg -T #按照人类可读性高的时间戳 比如2024-05-15 01:20:16实操&#xff1…

快速学习SpringAi

Spring AI是AI工程师的一个应用框架,它提供了一个友好的API和开发AI应用的抽象,旨在简化AI应用的开发工序,例如开发一款基于ChatGPT的对话应用程序。通过使用Spring Ai使我们更简单直接使用chatgpt 1.创建项目 jdk17 引入依赖 2.依赖配置 …

敏捷开发最佳实践:自驱团队实践案例之心情曲线回顾会

调研发现,26%的中国企业认为最有价值管理实践是“团队回顾会”,而“团队回顾会”的确能够很好的引导团队走向自驱。在本节的实践案例中 “心情曲线回顾会”的具体做法较为典型,很值得参考。 本实践节选自《2021中国企业敏捷实践白皮书》&…

压力给到 Google,OpenAI 发布 GPT-4o 来了

北京时间5月14日凌晨1点,OpenAI 开启了今年的第一次直播,根据官方消息,这次旨在演示 ChatGPT 和 GPT-4 的升级内容。在早些时候 Sam Altman 在 X 上已经明确,「我们一直在努力开发一些我们认为人们会喜欢的新东西,对我…

OpenNJet产品体验:探索无限可能

文章目录 前言一、OpenNJet是什么?二、OpenNJet特性和优点三、OpenNJet功能规划四、OpenNJet快速上手五、OpenNJet的使用总结 前言 现代社会网络高速发展,同时也迎来了互联网发展的高峰,OpenNJet作为一个基于NGINX的面向互联网和云原生应用提…

爬虫入门经典(七) | 采集淘宝电场相关信息

大家好,我是不温卜火,昵称来源于成语—不温不火,本意是希望自己性情温和。 PS:由于现在越来越多的人未经本人同意直接爬取博主本人文章,博主在此特别声明:未经本人允许,禁止转载!&a…

string功能介绍(普及版)

目录 1。初始化(好几种方式),npos和string的使用说明 2。string的拷贝,隐式类型转换,[],size,iterator,begin,end,reverse,reverse_iterator&am…

【回溯】1240. 铺瓷砖

本文涉及知识点 回溯 LeetCode1240. 铺瓷砖 你是一位施工队的工长,根据设计师的要求准备为一套设计风格独特的房子进行室内装修。 房子的客厅大小为 n x m,为保持极简的风格,需要使用尽可能少的 正方形 瓷砖来铺盖地面。 假设正方形瓷砖的…

windows驱动开发-PCI和中断(二)

谈到中断使用PCI总线来作为例子是最合适的,在Windows发展过程中,PCI作为最成功的底层总线,集成了大量的外设,不夸张的说,目前PCI几乎是唯一的总线选择,故大部分情况下,只有PCI设备驱动程序会遇到…

前端 performance api使用 —— mark、measure计算vue3页面echarts渲染时间

文章目录 ⭐前言💖vue3系列文章 ⭐Performance api计算持续时间💖 mark用法💖 measure用法 ⭐计算echarts渲染的持续时间⭐结束 ⭐前言 大家好,我是yma16,本文分享关于 前端 performance api使用 —— mark、measure计…

java springboot连接sqlserver使用

pom.xml增加sqlserver驱动 <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jdbc</artifactId><version>9.4.0.jre8</version></dependency>application.yml配置文件 server:port: 9001 #spring: …

多格式兼容的在线原型查看:Axure RP的便捷解决方案

Axure rp不仅可以绘制详细的产品构思&#xff0c;还可以在浏览器中生成html页面&#xff0c;但需要安装插件才能打开。安装Axure后 rpchrome插件后&#xff0c;还需要在扩展程序中选择“允许访问文件网站”&#xff0c;否则无法在Axure中成功选择 rp在线查看原型。听起来很麻烦…

用友GRP-U8 userInfoWeb SQL注入致RCE漏洞复现 (XVE-2024-10539)

0x01 产品简介 用友GRP-U8R10行政事业内控管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友GRP-U8R10行政事业内控管理软件 userInfoWeb接口处存在SQL注入漏洞,未授权的…