灰度发布,现在是很多大项目的一个标配运维特性,我们可以将一个“新的版本代码”发布到集群中的少数几台(组)机器上,以便引入线上少量真实用户进行测试,用于验证产品改进的收益、小规模试错等。nginx提供了“nginx_http_split_clients_module”、“nginx_stream_split_clients_module”,分别适用于http和tcp,可以帮助我们简单实现这些功能,不过如果你需要高度自动化、自主化的特性,或许需要进行一定的扩展和改造。
split模块在0.8版本就已经有了,使用起来也非常简单:
split_clients string $variable {....}
此指令的上下文为http。
1、假如,我们的web项目中提供了2个html页面,其中index_new.html为最新发布页面,index.html为旧页面,为了“避免新页面有BUG,而影响全站用户”、“测试新页面上体验改进是否符合预期”,我们将index页面的访问流量中的10%转发到新页面上,剩余90%继续使用旧页面。
split_clients "${remote_addr}_1qazxsw2" $variant { 10% _new; * ""; } server { ... location / { index index${variant}.html; }
2、假如,我们的web项目中发布了新的功能,为了避免程序BUG导致大规模异常,减少影响面,我们也可以使用spit做“切流量上线”;首先我们需要将线上的机器分为多个group,每个group中可以包含一定数量的server,简单而言,就是一个group就是一个upstream;比如我们30台机器,我们想切10%的流量发布新版本,那么就将3台机器组成一个“灰度组”来发布新程序,其他机器继续运行旧的web程序;当灰度组经过多日的观察,确实没有太大问题,我们则可以取消灰度组,全量上线发布。
split_clients "${remote_addr}_1qazxsw2" $group { 10% gray_group; * main_group; } upstream gray_group { server 10.0.1.11; ... } upstream main_group { .... } server { ... location / { proxy_pass http://${group}; }
上述配置文件中,我们可以看到split模块的使用方式,“split_clients”指令接受2个参数,nginx将会根据第一个参数的值使用MurmurHash2算法计算hashcode,hashcode值域为0~4294967295(即2<<31 - 1),通常第一个参数是一个动态值,比如用户的ip、session_id等。10%是表示一个区域,如果第一个参数的hashcode值,在0 ~ 4294967295 *10%之间,则将“_new”赋值给$variant;20%表示第一个参数的hashcode值,在4294967295 * (10% ~ 20%)区间时....依次轮推,"*"表示上述区间都没有覆盖的值域,将使用的值。
我们发现这种方式的灰度发布,其实流量导入的比例并非严格。如果你的服务多次灰度发布,可能会导致某些IP总是在灰度区域,有时候我们需要调整spit第一个参数的随机数因子,本例中"${remote_addr}_1qazxsw2",“_1qazxsw2”这个补充字符串就是随机因子,每次灰度发布,我们需要修改这个值以避免上一次灰度的IP再次进入灰度,当然这个操作也是没有太大必要。
通常我们还有一些更加苛刻的要求,比如强制要求某个IP、用户ID进入灰度区域。那么使用spit模块就显得有些不太适应,要么使用nginx的geo组件将相应的IP、uid添加到geo文件中(还需要后端程序在cookie输入相应的uid值,以便nginx获取和判断)。对于这种有很多“个性化”条件的,我们可以使用nginx + lua + redis (memcached)实现,其中lua作为脚本语言来做条件判断工具以及使用redis客户端操作数据,redis用于存储需要灰度的用户信息,此外可能还需要开发一个后端程序来运营redis中的数据,比如将某个uid加入redis,lua从cookie中读取uid并检查redis中是否存在,如果存在则进入灰度区域。
相关推荐
使Nginx实现灰度发布 -weifengCorp - 博客园upstream hilinux_01 { server 192.168.1.100:8080 m
nginx sticky是nginx的module,可以实现基于cookie的负载均衡。 下载后,在编译安装nginx时,用--add-module选项,指到sticky所在目录。类似命令如下: ./configure --prefix=/usr/local/nginx-1.6.0 --add-module=...
在windows 7 64位 环境下使用nginx的nginx-http-flv-module搭建flv视频流播放所有的安装包,参考:https://blog.csdn.net/qq_33071429/article/details/102628008
1、最新版 nginx-http-flv-module(windows可执行程序,含nginx 1.19.3,http-flv-module:1.2.7) 2、内含说明文档,请下载查看。 3、请勿放置于中文路径下,否则无法启动
windows平台nginx编译nginx-http-flv-module,可直接运行,基于nginx-1.17.10编译
--> nginx-1.21.6 ======================== 在网上查找半天都只有教程,没有可免费下载的版本,深知没有积分遍地找资源的痛苦,无奈之下只好自己按照教程一步一个坑编译出来的,供大家免费下载使用。(无毒放心使用...
1、最新版 nginx-http-flv-module(linux可执行程序,含nginx 1.19.3,http-flv-module:1.2.7) 2、内含说明文档,请下载查看。 3、请勿放置于中文路径下,否则无法启动 4、sbin/nginx -c conf/nginx.conf
资源说明: 1. 采用nginx最新版编译,包含最新的nginx-http-flv-module,以及基础模块openssl、prce、zlib 2. 整体打包,已配置好nginx.conf的http-flv直播流,以及http web环境...3. 使用nginxservice.exe install安装
nginx带nginx-http-flv模块,包含所有rtmp功能,我自己在windows下编译的,直接可用,用的是最新版的1.19.4版本
此资源有两个文件,含 nginx-upstream-jvm-route 和 nginx 对应版本,都是tar.gz文件。 安装方法网上很多就不写了,亲测可用。 不用担心版本不匹配造成安装失败,再浪费积分去到处下载尝试的烦恼。 此资源有两个文件...
(a)客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。 (b)后端服务器处理完请求,将响应数据返回给nginx。 (c)此时nginx生成带route的cookie,返回给...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
windows下编译nginx-http-flv-moudle,编译好的,下载开箱可用,作者亲测。用于直播推流,浏览器flvjs播放视频,支持无插件flash播放。
添加nginx-http-flv-module模块并重新编译后的nginx(windows版)
nginx-rtmp-module-master源码
nginx + nginx-http-flv-module-1.2.9
基于nginx1.19.3版本,已编译好nginx-http-flv-module,开箱即用。鄙视那些收C币的。
nginx-rtmp模块源码包nginx-rtmp-module-master
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
windows服务注册: 1. 将压缩包解压到D:\nginx-1.19.3目录下 2. 使用cmd命令打开DOS,并切换到D:\nginx-1.19.3 3. 使用nginxservice.exe install安装 若需要自定义路径,注意在nginxservice.xml文件中修改路径