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. BPM7.5.1升级细节,万事开头难

    背景:Linux5.9,BPM 7.5.0集群环境,内置WAS ND7.0.0.17 详情见上图 故障现象:升级BPM 7.5.1集群环境 1,按照 IBM 信息中心步骤,升级BPM需下载相应补丁 包 ...

  2. Oracle11g重建EM 报ORA-20001: SYSMAN already exists

    日志: Apr , :: PM oracle.sysman.emcp.EMReposConfig createRepository : SYSMAN already exists.. ORA-0651 ...

  3. ORACLE Recyclebin管理及flashback recyclebin中的对象

    Flashback用于恢复用户误删除的对象(包括表,索引等), 不支持sys用户. system表空间下的对象,也不能从回收站里拿到.故使用SYS 或者SYSTEM用户登陆时, show recycl ...

  4. 计算(a/b)%c

    如果b与c互素,则(a/b)%c=a*b^(phi(c)-1)%c 如果b与c不互素,则(a/b)%c=(a%bc)/b 对于b与c互素和不互素都有(a/b)%c=(a%bc)/b成立

  5. css中关于transform、transition、animate的区别

    写动画经常会用到这几个属性,他们之间有什么区别呢? 1.transform 每每演示transform属性的,看起来好像都是带动画.这使得小部分直觉化思维的人(包括我)认为transform属性是动画 ...

  6. Oracle 物理DG切换

    在进行DATA GUARD的物理STANDBY切换前需要注意:确认主库和从库间网络连接通畅:确认没有活动的会话连接在数据库中:PRIMARY数据库处于打开的状态,STANDBY数据库处于MOUNT状态 ...

  7. C# 10 总复习

    数据类型--变量与常量--运算符与表达式--语句(if,for)--数组--函数--结构体 一.数据类型: (一)内建类型 整型(int short long byte uint ushort ulo ...

  8. Git教程--Git分支管理

    分支管理--原理分析 在前面讲到的版本回退里,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.只有一条时间线的这条分支称为master,HEAD严格来说不是指向提交,而是指向maste ...

  9. 转载 Jquery中AJAX参数详细介绍

    Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求方式 ...

  10. 表单提交中get与post的区别

    在Form里面,可以使用post也可以使用get.它们都是method的合法取值. 1. get是从服务器上获取数据,post是向服务器传送数据.   2. get是把参数数据队列加到提交表单的ACT ...