upstream.conf

upstream grey_1
{
keepalive 1000;
server localhost:8020;
} upstream grey_2
{
keepalive 1000;
server localhost:8021;
}

8020 conf

#vhost conf
server{
listen 8020;

index index.php index.html index.do;
root /var/html/webroot/grey_1; access_log "/data/logs/nginx/access.log" ;
error_log "/data/logs/nginx/error.log" warn; location / {
if ( !-e $request_filename ) {
rewrite ^/(.*) /index.php last;
}
} location ~ \.(php|do)($|/) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
set $path_info $request_uri;
if ( $request_uri ~ ^/(v\d)(\/.*)(\?.*)?$){
set $path_info $2;
break;
} fastcgi_param PATH_INFO $path_info;
}
}

8021 conf

#vhost conf
server{
listen 8021;
index index.php index.html index.do;
root /var/html/webroot/grey_2 access_log "/data/logs/nginx/access.log" ;
error_log "/data/logs/nginx/error.log" warn; location / {
if ( !-e $request_filename ) {
rewrite ^/(.*) /index.php last;
}
} location ~ \.(php|do)($|/) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
set $path_info $request_uri;
if ( $request_uri ~ ^/(v\d)(\/.*)(\?.*)?$){
set $path_info $2;
break;
} fastcgi_param PATH_INFO $path_info;
}
}

nginx.conf

#vhost conf
server{
listen 8000;
index index.php index.html index.do;
root /var/html/www/webroot/index; access_log /data/logs/index_access.log;
error_log /data/logs/index_error.log warn; lua_code_cache off; location /lua { content_by_lua '
ngx.say( "hello" )
';
} location / {
if ( !-e $request_filename ) {
rewrite ^/(.*) /index.php last;
}
} location /grey/ {
default_type 'text/plain';
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Connection "";
proxy_http_version 1.1; set $backend "grey_1";
rewrite_by_lua_file conf/lua/grey.proxy.lua;
proxy_pass http://$backend/?$args; }

grey.proxy.lua

local grey = require "greyrelease.grey"

local upstream = grey.get_upstream_by_userid()

-- ngx.say( upstream )

ngx.var.backend = upstream

grey.lua

local strings = require "resty.string"

local _M = {}

local hash_standard =
local hash_max_len =
local default_stream = "grey_1" local search_stream = "grey_2" local hash_map = {
-- grey_0 = {range_start=0,range_end=9,flow="grey1"},
grey_0 = {range_start=,range_end=,flow="grey1"},
grey_1 = {range_start=,range_end=,flow="grey1"},
grey_2 = {range_start=,range_end=,flow="grey1"},
grey_3 = {range_start=,range_end=,flow="grey1"},
grey_4 = {range_start=,range_end=,flow="grey1"},
grey_5 = {range_start=,range_end=,flow="grey1"},
grey_6 = {range_start=,range_end=,flow="grey1"},
grey_7 = {range_start=,range_end=,flow="grey1"},
grey_8 = {range_start=,range_end=,flow="grey1"},
grey_9 = {range_start=,range_end=,flow="grey1"},
} function _M.get_upstream_by_userid() if ngx.var.arg_grey_test == "grey_1" then
return search_stream
elseif ngx.var.arg_grey_test == "grey_2" then
return default_stream
end local user_id=ngx.var.arg_user_id local upstream=default_stream
if user_id == nil then
return upstream
end local hex_string = strings.to_hex( user_id )
local str_len = string.len( hex_string ) local hash_string = "" if str_len > hash_max_len then
hash_string = string.sub( hex_string,,hash_max_len )
else
hash_string = hex_string
end local int_mod = math.fmod( hash_string,hash_standard ) for k,v in pairs( hash_map ) do
if v['range_start'] <= int_mod and int_mod < v['range_end'] then
upstream = v['flow']
break
end
end return upstream
end return _M

基于nginx+lua简单的灰度发布系统的更多相关文章

  1. nginx+lua+redis实现灰度发布_test

    nginx+lua+redis实现灰度发布: 灰度发布是指在黑白之间能够平滑过渡的一种方式 AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见, ...

  2. 利用nginx+lua+memcache实现灰度发布

    一.灰度发布原理说明 灰度发布在百度百科中解释: 灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式.AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什 ...

  3. 新浪的动态策略灰度发布系统:ABTestingGateway

    原文链接:http://www.open-open.com/lib/view/open1439889185239.html ABTesingGateway 是一个可以动态设置分流策略的灰度发布系统,工 ...

  4. 基于nginx+lua+redis高性能api应用实践

    基于nginx+lua+redis高性能api应用实践 前言 比较传统的服务端程序(PHP.FAST CGI等),大多都是通过每产生一个请求,都会有一个进程与之相对应,请求处理完毕后相关进程自动释放. ...

  5. 01 . OpenResty简介部署,优缺点,压测,适用场景及用Lua实现服务灰度发布

    简介 OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高的动态 ...

  6. nginx 根据IP 进行灰度发布

    灰度发布,简单来说,就是根据各种条件,让一部分用户使用旧版本,另一部分用户使用新版本. nginx 的语法本身可以看作是一门小型的编程语言,通过简单的编程,可以轻松实现基于IP的灰度发布. 需求:搭建 ...

  7. 基于nginx + lua实现的反向代理动态更新

    大家都知道,nginx是当前应用非常广泛的web服务器,热度因为他的高并发高性能高可靠性,且轻量级!牛逼的不行,不多说这些. 今天要介绍的是,如何基于nginx和lua脚本,也就是在openresty ...

  8. 基于springcloud gateway + nacos实现灰度发布(reactive版)

    什么是灰度发布? 灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式.在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B ...

  9. php简单手机商品发布系统

    原本还说学学angular2的,没想到上一公司呆了两月就走了,现在在这个公司做了一个小型的商品发布系统,,php实现的,比较简单,功能不多,是以手机模板发布商品网站的,需要的可以拿去 http://p ...

随机推荐

  1. LeetCode Day1

    Palindrome Linked List /** * LeetCode: Palindrome Linked List * Given a singly linked list, determin ...

  2. JavaScript 【跨浏览器处理XML,做个兼容】

    //兼容方法        function getXMLDOM(xmlStr) {            var xmlDom = null;            if (typeof windo ...

  3. android stuido 快捷键

    Alt+回车 导入包,自动修正 Ctrl+N   查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L  格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+Insert 生成代码 ...

  4. JavaScript Set Cursor Style

    <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <titl ...

  5. Linux修改Shell命令提示符及颜色

    Linux修改Shell命令提示符及颜色 1. Linux登录过程中加载配置文件顺序: /etc/profile → /etc/profile.d/*.sh → ~/.bash_profile → ~ ...

  6. zoj 1067

    输入一组RGB颜色列表,每行一个颜色,是三个从0~255的整数 前16行是目标颜色组,-1 -1 -1表示结束   16组颜色以后接下来的几行是需要判断的,看它和哪个颜色的距离D最小,找出这个对应的颜 ...

  7. javascript - 工作笔记 (事件三)

    有关定义就不多说了,事件分两种 一,冒泡型事件 这是IE浏览器中事件模型的实现,顾名思义,就像水中的泡一样,自底而上,其经过的父元素都会触发对应的事件. 即:触发元素的父元素先于触发元素触发,看dem ...

  8. 全局键盘钩子(WH_KEYBOARD)

    为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找. KeyBoardHook.dll代码 libr ...

  9. 【Itext】7步制作Itext5页眉页脚pdf实现第几页共几页

    itext5页眉页脚工具类,实现page x of y 完美兼容各种格式大小文档A4/B5/B3,兼容各种文档格式自动计算页脚XY轴坐标 鉴于没人做的这么细致,自己就写了一个itext5页眉页脚工具类 ...

  10. chrome浏览器debugger 调试,有意思。

    JavaScript代码中加入一句debugger;来手工造成一个断点效果. 例子: ajax看看返回的数据内容,或者想知道js变量获取值是什么的时候. $.ajax({ type:"pos ...