nginx+lua+redis 实现灰度发布

2020-12-19  本文已影响0人  mafa1993
  1. 根据用户id或者ip进行判断,进行灰度发布,
  2. openresty的配置语法和nginx相同
  3. openresty start stop reload -c 配置文件
  4. openresty的效率要比nginx性能好一些
  5. lua_code_cache off; 关闭lua代码缓存,修改了lua file的代码,不用reload就会立即生效
  6. ubuntu下安装
  7. 安装时,如果原有nginx没停止,发生了端口占用,openresty启动不起来,不报错
location /test {
    content_by_lua_file /etc/nginx/lua/graysgrays.lua;
}

# lua 
-- ngx.header.content="text/plain";
ngx.header["Content-Type"] = "text/plain;charset=URF-8" -- 响应头Content-Type设置,不设置utf-8中文会出错
ngx.say("hello world");
ngx.exit(200); --状态码

灰度发布

--[[
测试输出hello world

ngx.header["Content-Type"] = "text/plain;charset=UTF-8"
ngx.say("hello world!")
ngx.exit(200) -- 状态码

]]


-- 引入redis客户端
local redis = require "resty.redis";
--ngx.log(ngx.ERR,redis);

--ngx.exit(200);

-- 获取客户端ip,需要灰度发布的
-- local client_ip = ngx.req.get_headers();
-- 也可以使用 ngx.var()直接获取nginx内置变量进行使用

local ip = ngx.var.remote_addr;

-- 记录日志 定义错误等级,内容
if ip == nil then
    ngx.log(ngx.ERR,'ip---',ip)
end

--ngx.log(ngx.ERR,‘ip---’,local_ip)

-- 连接redis,查询数据
local cache = redis.new()

local ok,err = cache.connect(cache,'127.0.0.1',6379)

-- cache.auth 认证使用
if not ok then
    -- 连接出错
    ngx.log(ngx.ERR,'链接出错')
    return;
end

local allow_ip = cache:get(ip) -- 是否存在这个key

if allow_ip == ip then 
   ngx.exec("@client2","a=2") -- 内部请求
   -- ngx.exec("/abc","a=2")
   -- 在rewrite assess content阶段可以使用
   return
end

ngx.exec("@client1")

cache:close(); --关闭redis连接

# nginx
# 内部请求,到upstream
upstream client1 {
    server 127.0.0.1:9501;
}

upstream client2 {
    server 127.0.0.1:9502;
}
http {
    server {
        location @client1 {
            proxy_pass http://client1;
        }
        
        location @client2 {
            proxy_pass http://client2;
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读