当前位置: 首页 > Linux

基于Nginx+lua+Memcache的灰度发布

时间:2023-04-07 02:02:01 Linux

作者:温飚原文:https://www.cnblogs.com/wenbi...一、灰度发布原理灰度发布详见百度百科:灰度高-速释是指能够在黑白之间平滑过渡的释放方式。AB测试是一种灰度发布方式,让一部分用户继续使用A,一部分用户开始使用B,如果用户对B没有异议,那么逐步扩大范围,将所有用户迁移到B。灰度发布可以保证稳定性对整个系统进行优化,在初始灰度阶段就可以发现问题并进行调整,以保证其影响。这里对WEB系统的新代码做一个测试发布,让部分(IP)用户访问新版本,部分用户仍然访问普通版本。模块解析Nginx配置文件中的lua脚本代码;Lua变量获取客户端IP地址,检查key值是否存在于memcached缓存中。如果有返回值,则执行@client_test,否则执行@client。location@client_test将请求转发到部署新版本代码的服务器,location@client将请求转发到部署正常版本代码的服务器,服务器返回结果。整个过程就完成了。下面详细介绍安装配置过程。二、安装配置过程详解1、安装nginx安装依赖包yum-yinstallgccgcc-c++autoconflibjpeglibjpeg-devellibpnglibpng-develfreetypefreetype-devellibxml2libxml2-develzlibzlib-develglibcglibc-develglib2glib2-develbzip2bzip2-develncursesncurses-develcurlcurl-devele2fsprogse2fsprogs-develkrb5krb5-devellibidnlibidn-developensslopenssl-developenldapopenldap-develnss_ldapopenldap-clientsopenldap-serversmakepcre-develyumd-gydinst2develgd2-devellualua-develyum–yinstallmemcached下载lua模块、lua-memcache运行库文件和nginx包wgethttps://github.com/simpl/ngx_devel_kit/archive/v0.2.18.tar.gzwgethttps://github.com/chaoslawful/lua-nginx-module/archive/v0.8.5.tar.gzwgethttps://github.com/agentzh/lua-resty-memcached/archive/v0.11.tar.gzwgethttp://nginx.org/download/nginx-1.4.2.tar.gz#解压编译安装tarxvfnginx-1.4.2.tar.gzcdnginx-1.4.2/./configure\--prefix=/soft/nginx/\--with-http_gzip_static_module\--add-module=/root/ngx_devel_kit-0.2.18/\--add-module=/root/lua-nginx-module-0.8.5/make&&makeinstall选贝lua的memcached操作库文件tarxvfv0.11.tar.gzcp-rlua-resty-memcached-0.11/lib/resty//usr/lib64/lua/5.1/配置nginx#vim/soft/nginx/conf/nginx.confworker_processes1;events{worker_connections1024;}http{includemime.types;default_typeapplication/octet-stream;发送文件开启;keepalive_timeout65;proxy_next_upstream错误超时;proxy_redirect关闭;proxy_set_header主机$host;proxy_set_headerX-Real-IP$http_x_forwarded_for;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;client_max_body_size100m;client_body_buffer_size256k;proxy_connect_timeout180;proxy_send_timeout180;proxy_read_timeout180;proxy_buffer_size8k;proxy_buffers864k;proxy_busy_buffers_size128k;proxy_temp_file_write_size128k;上游客户端ent{服务器192.168.200.29:80;}上游client_test{服务器192.168.200.29:81;}服务器{听80;服务器名称本地主机;location/{content_by_lua'clientip=ngx.req.get_getheaders()[“x-real-ip”]如果clientip==nil,则clientip=ngx.req.get_headers()clientip=ngx.var.remote_addrendlocalmemcached=require“resty.memcached”localmemc,err=memcached:new()如果不是memc,则ngx.say(“未能实例化memc:”(“失败)err=memc:connect("127.0.0.1",11211)如果不行则ngx.say("连接失败:",err)返回sgs,err=memc:get(clientip)如果errthenngx.say(“失败获得clientip”,err)返回结束如果res==“1”,则ngx.exec(“@client_test”)返回engendngx.exec(“@客户”)';}location@client{proxy_passhttp://client;}location@client_test{proxy_passhttp://client_test;}location/hello{default_type'text/plain';content_by_lua'ngx.say("hello,lua")';}location=/50x.html{roothtml;}}}检测配置文件#/soft/nginx/sbin/nginx-tnginx:配置文件/soft/nginx/conf/nginx.conf语法是oknginx:配置文件/soft/nginx/conf/nginx.conf测试成功启动nginx/soft/nginx/sbin/nginx启动memcached服务memcached-U没有人-M1024-C2048-P11211–D三三测试lualualualualua模块如果显示:hello,lua表示安装成功。在另一台测试机(这里是192.168.200.29)上设置两台虚拟主机,一台使用80端口执行普通代码,一台使用81端口执行灰度测试代码。在memcached中,使用你的客户端IP地址作为key,value为1。这里我的IP是192.168.68.211.telnetlocalhost11211Trying::1...Connectedtolocalhost.Escapecharacteris'^]'.set192.168.68.2110360011STOREDget192.168.68.211VALUE192.168.68.211VALUE192.168.68.2119:set后的第一个值是键值。192.168.68.211这是key值需要灰度测试的IP地址;0表示与key相关的自定义数据;3600表示key值的有效时间;1表示键段号对应的值的字。下面访问Nginx,效果和预期的一样,我的IP已经把值存到memcached中了,所以请求转发给执行灰度测试代码的主机。从memcached中删除我的主机IP值。再次请求Nginx,将请求转发给执行正常代码内容的主机。整个配置并不复杂,整个判断过程对服务影响很小。如果需要使用这个系统,最好自己看一下lua脚本。最新2TB技术干货:包括架构师实战教程、大数据、Docker容器、系统运维、数据库、redis、MongoDB、电子书、Java基础课程、Java实战项目、ELKStack、机器学习、BAT面试精读讲座视频等,只需在“打工哥科技之路”微信公众号对话框回复关键字:1024即可获取所有信息。