`

nginx+lua+memcache实现灰度发布

阅读更多

一、灰度发布原理说明

灰度发布在百度百科中解释:

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

 

这里的用于WEB系统新代码的测试发布,让一部分(IP)用户访问新版本,一部分用户仍然访问正常版本,其原理如图:

 

 

执行过程:

1、      当用户请求到达前端代理服务Nginx,内嵌的lua模块解析Nginx配置文件中的lua脚本代码;

2、      Lua变量获得客户端IP地址,去查询memcached缓存内是否有该键值,如果有返回值执行@client_test,否则执行@client。

3、      Location @client_test把请求转发给部署了new版代码的服务器,location @client把请求转发给部署了normal版代码的服务器,服务器返回结果。整个过程完成。

下面把安装配置过程详细说明。

 

二、安装配置过程详解

1、安装nginx

安装依赖包

复制代码
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers make pcre-devel

yum -y install gd gd2 gd-devel gd2-devel lua lua-devel

yum –y install memcached
复制代码

 

下载lua模块、lua-memcache操作库文件和nginx包

复制代码
wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.18.tar.gz

wget https://github.com/chaoslawful/lua-nginx-module/archive/v0.8.5.tar.gz

wget https://github.com/agentzh/lua-resty-memcached/archive/v0.11.tar.gz

wget http://nginx.org/download/nginx-1.4.2.tar.gz

tar xvf nginx-1.4.2.tar.gz

cd nginx-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

make install
复制代码

 

拷贝lua的memcached操作库文件

tar xvf v0.11.tar.gz

cp -r lua-resty-memcached-0.11/lib/resty/ /usr/lib64/lua/5.1/


 

配置nginx

复制代码
#vim /soft/nginx/conf/nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    proxy_next_upstream     error timeout;

    proxy_redirect          off;

    proxy_set_header        Host $host;

    proxy_set_header        X-Real-IP $http_x_forwarded_for;

    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

    client_max_body_size    100m;

    client_body_buffer_size 256k;

    proxy_connect_timeout   180;

    proxy_send_timeout      180;

    proxy_read_timeout      180;

    proxy_buffer_size       8k;

    proxy_buffers           8 64k;

    proxy_busy_buffers_size 128k;

    proxy_temp_file_write_size 128k;

     upstream client {

        server   192.168.200.29:80;

    }

    upstream client_test {

        server   192.168.200.29:81;

    }

    server {

        listen       80;

        server_name  localhost;

       location / {

       content_by_lua '

            clientIP = ngx.req.get_headers()["X-Real-IP"]

            if clientIP == nil then

                clientIP = ngx.req.get_headers()["x_forwarded_for"]

            end

            if clientIP == nil then

                clientIP = ngx.var.remote_addr

            end

                local memcached = require "resty.memcached"

                local memc, err = memcached:new()

                if not memc then

                    ngx.say("failed to instantiate memc: ", err)

                    return

                end

                local ok, err = memc:connect("127.0.0.1", 11211)

                if not ok then

                    ngx.say("failed to connect: ", err)

                    return

                end

                local res, flags, err = memc:get(clientIP)

                if err then

                    ngx.say("failed to get clientIP ", err)

                    return

                end

                if  res == "1" then

                    ngx.exec("@client_test")

                    return

                end

                 ngx.exec("@client")

               

               ';

       }

       location @client{

           proxy_pass http://client;

       }

       location @client_test{

           proxy_pass http://client_test;

       }

    location /hello {

        default_type 'text/plain';

        content_by_lua 'ngx.say("hello, lua")';

    }

    location = /50x.html {

        root   html;

    }

   }

}
复制代码

 

检测配置文件。

#/soft/nginx/sbin/nginx -t

nginx: the configuration file /soft/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /soft/nginx/conf/nginx.conf test is successful

 

启动nginx

/soft/nginx/sbin/nginx

 

启动memcached服务

memcached -u nobody -m 1024 -c 2048 -p 11211 –d

 

 

三、测试验证

测试lua模块是否运行正常

访问http://测试服务器ip地址/hello。如果显示:hello,lua 表示安装成功。

 

 

 

在另一台测试机(这里是192.168.200.29)设置两个虚拟主机,一个用80端口是执行正常代码,一个是81端口执行灰度测试代码。

 

在memcached中以你的客户机IP地址为key,value值为1。这里我的IP是192.168.68.211.

复制代码
telnet localhost 11211

Trying ::1...

Connected to localhost.

Escape character is '^]'.

set 192.168.68.211 0 3600 1

1

STORED

get 192.168.68.211

VALUE 192.168.68.211 9 1

1

END

quit
复制代码

 

 

注意:

set后第一个值为key值。

192.168.68.211这是key值是需要灰度测试的IP地址;

0 表示一个跟该key有关的自定义数据;

3600 表示该key值的有效时间;

1 表示key所对应的value值的字节数。

 

下面访问Nginx,效果符合预期,我的IP已经在memcached中存储值,所以请求转发给执行灰度测试代码的主机。

 

从memcached删除我的主机IP值。

 

再次请求Nginx,请求转发给执行正常代码内容的主机。

 

 

整个配置并不复杂,整个判断过程对服务的影响非常小。如果需要使用这个系统最好自己看看lua脚本。

分享到:
评论

相关推荐

    nginx+lua+redis通过匹配客户端ip进行灰度发布

    nginx+lua+redis通过匹配客户端ip进行灰度发布 本文将讲述如何使用nginx、lua和redis来实现灰度发布,通过匹配客户端IP来实现灰度发布。灰度发布是一种常见的软件发布方式,它允许开发者在生产环境中发布新的版本,...

    nginx+lua+redis 集群 连接插件和脚本

    本资源包“nginx+lua+redis集群 连接插件和脚本”正是为了解决这三者之间的协同工作,特别是针对原插件没有密码功能的问题进行了改进,使得安全性得到了提升。 首先,Nginx是一款轻量级的Web服务器/反向代理服务器...

    Nginx+lua通过url传参的方式实现动态代理

    ### Nginx+Lua通过URL传参方式实现动态代理 #### 概述 在现代Web应用开发中,灵活地管理后端服务之间的通信是至关重要的。动态代理技术为这一需求提供了解决方案,使得前端可以方便地根据业务逻辑将请求转发至不同...

    nginx+lua+redis实现token验证

    本文将深入探讨如何利用`nginx+lua+redis`来实现`token`验证,以确保只有经过授权的用户才能访问受保护的资源。 首先,让我们理解`token`验证的基本原理。`token`验证是一种身份验证机制,它允许客户端通过提供一个...

    跟我学Nginx+Lua开发_nginxlua原理_nginx_

    《跟我学Nginx+Lua开发》这本书主要探讨了如何利用Nginx与Lua进行高效、灵活的Web服务开发。Nginx以其高性能、反向代理和负载均衡能力而闻名,而Lua则是一种轻量级的脚本语言,两者结合可以实现强大的服务器端功能。...

    Nginx+upload+lua实现简单文件上传服务

    总的来说,Nginx+upload+lua的组合提供了一种高效、灵活的文件上传解决方案,可以满足各种规模的应用场景。通过这种技术栈,你可以更好地控制文件上传过程,优化性能,以及实现自定义的业务逻辑。

    nginx+lua+docker+docker-compose实现简单服务分发

    nginx+lua+docker+docker-compose实现简单服务分发

    Nginx+Lua+GraphicsMagick图片缩略图

    Nginx+Lua+GraphicsMagick实现动态生成指定尺寸的图片

    基于nginx+lua+dyups实现服务自定义调度资源整理

    本文将详细讲解如何利用`nginx`、`lua`和`dyups`实现服务自定义调度,并探讨相关知识点。 **一、自定义服务调度** 自定义服务调度允许根据不同的客户端请求条件,如IP地址、用户标识、请求头等,将请求智能地转发...

    idea openrestry+nginx+lua搭建企业级开发环境

    在 OpenResty 中,Lua 能够与 Nginx 的 C 代码紧密交互,实现高性能的网络编程。通过 Lua,开发者可以快速实现复杂的功能,比如 URL 解析、会话管理、数据缓存等。同时,Lua 的模块系统也使得代码组织和重用变得简单...

    Nginx+Lua阿⾥实战经验谈.pdf

    《Nginx+Lua阿里巴巴实战经验谈》 Nginx+Lua在阿里巴巴的实践中扮演了重要角色,尤其在阿里巴巴云CDN事业部的应用中,这一组合展现出了强大的效能和灵活性。Nginx+Lua的起源可以追溯到淘宝时期,由创始人王晓哲和章...

    跟我学Nginx+Lua开发

    本文目的是学习Nginx+Lua开发,nginx+lua还会带来什么优势: 1、减少一层转发 ,使用其他服务语言来开发服务,肯定会使用一种协议在nginx和服务端直接进行通信。比如cgi、fcig、wsgi等。如果使用lua,因为lua是直接...

    京东李开涛 跟我学Nginx+Lua 开发

    ### 京东李开涛 跟我学Nginx+Lua 开发 #### 知识点一:Nginx+Lua 在Web高并发中的实践应用 - **背景介绍**:随着互联网技术的发展与用户需求的增长,如何高效地处理高并发访问成为各大网站必须面对的问题之一。...

    tests.lua nginx +lua 实现 访问远程地址 下载文件

    nginx +lua 实现 访问远程地址 下载文件 环境配置: 启动tomcat 把要下载的文件放到跟目录比如:pdf zip 等 启动nginx 访问nginx lua 打开socket 访问tomcat 文件路径,并下载到本地

    nginx+lua+php+redis实现单业务排队系统架构.zip

    软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发Node.js、C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、...

    高并发Nginx+lua是如何抗住的

    提到高并发或者抗压力,有这种高qps经验的同学第一反应大都是Nginx+lua+Redis,网上也满天非那种高并发架构方案大都是这种,但是Nginx+lua来做接入层到底是怎么抗住压力的呢?本篇顺序:1、Nginx如何抗住的高并发,...

    NGINX + LUA实现复杂的控制

    NGINX + LUA 实现复杂的控制 NGINX 是一款流行的 Web 服务器软件,而 LUA 是一种轻量级的脚本语言。通过将 NGINX 与 LUA 结合,可以实现复杂的控制功能。在本文中,我们将介绍如何使用 NGINX + LUA 实现复杂的控制...

    跟我学Nginx + Lua开发

    安装Nginx+Lua开发环境首先需要创建一个目录用于存放所有软件。之后,需要安装一些依赖,例如libreadline-dev、libncurses5-dev、libpcre3-dev、libssl-dev、perl等。接着,下载并解压OpenResty的源码包,执行...

    跟我学Nginx+Lua开发.pdf

    ### Nginx+Lua开发环境搭建与应用 #### 一、Nginx+Lua开发环境简介 《跟我学Nginx+Lua开发》是一本针对Nginx与Lua结合使用的教程书籍,旨在帮助读者理解如何利用这两种技术进行高效且灵活的Web应用开发。Nginx作为...

Global site tag (gtag.js) - Google Analytics