安裝包部署

wget https://openresty.org/download/openresty-1.19.9.1.tar.gz tar -zxvf openresty-1.19.9.1.tar.gz cd openresty-1.19.9.1/ ./configure --prefix=/opt/resource/openresty-1.19.9.1 make && make install

操作

启动 /opt/resource/openresty-1.19.9.1/nginx/sbin/nginx -c /opt/resource/openresty-1.19.9.1/nginx/conf/nginx.conf

检查 /opt/resource/openresty-1.19.9.1/nginx/sbin/nginx -t

重新加载 /opt/resource/openresty-1.19.9.1/nginx/sbin/nginx -s reload

停止 /opt/resource/openresty-1.19.9.1/nginx/sbin/nginx -s stop

支持lua

server {
	listen       8080;
	server_name  0.0.0.0;
	add_header 'Access-Control-Allow-Origin' '*';
	add_header 'Access-Control-Allow-Credentials' 'true';
	location /hello {
		default_type text/html;
		content_by_lua 'ngx.say("Hello Lua!")';
	}

}

# 灰度服务器
upstream grayscale.server{
	server 192.168.16.161:3700;
}

# 正式服务器
upstream prod.server{
	server 192.168.16.161:3700;
}

server {
	listen       3701;
	server_name  0.0.0.0;
	location ^~ /project {
			# 默认为生产环境
			set $target 'prod.server';
			access_by_lua_file /openresty-1.19.9.1/nginx/conf/conf.d/lua/grayscale.lua;
			proxy_pass $scheme://$target$request_uri;
			proxy_http_version 1.1;
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection "upgrade";
			proxy_read_timeout 1800s;
			proxy_set_header   Origin           $scheme://$http_host$request_uri;
			proxy_set_header   Host             $host;
			proxy_set_header   X-Real-IP        $remote_addr;
			proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
			proxy_buffer_size  128k;
			proxy_buffers   32 32k;
			proxy_busy_buffers_size 128k;
	}
}

grayscale.lua



local headers = ngx.req.get_headers()
--[ 获取get_headers的x-is-gray 同时转换数字  --]
local isGray = tonumber(ngx.req.get_headers()["x-is-gray"])
local headerToken = ngx.req.get_headers()["project-token"]
-- 引入redis客户端
local redis = require "resty.redis";
local red = redis:new()
red:connect("192.168.16.161",6379)
--连接密码 red:auth("RMZXkuXuwFTzzS5x")
red:auth(nil)
-- 选择操作的数据库
red:select(1)

-- redis db2
local redt = redis:new()
redt:connect("192.168.16.161",6379)
redt:auth(nil)
redt:select(2)

ngx.log(, "isGray === >",isGray)
ngx.log(, "headerToken === >",headerToken)
-- ngx.log(, " and not  ", ( (1 == isGray) and not(headerToken == null)))
-- 判断请求头带了 x-is-gray 且project-token 不为空
if( (1 == isGray) and not(headerToken == null)) then
    -- 查询redis状态
    local grayUserStatus = tonumber(red:get("GRAY_USER::grayUserStatus"))
    ngx.log(, "查询redis状态 grayUserStatus === >",grayUserStatus)
    if (1 == grayUserStatus) then
        -- 查询project-token
        local projectToken = tostring(ngx.req.get_headers()["project-token"])
        ngx.log(, "查询project-token === >",projectToken)
        -- 依据project-token 查询userid
        local userId = tostring(redt:get("project-token:login:token:"..projectToken))
        ngx.log(, "依据project-token查询userId === >",userId)
            if (userId ~= null) then 
			   -- 校验userid是否在灰度库中
			   ngx.log(, "userid >",userId)
			   local userExists = tonumber(red:exists("GRAY_USER::grayUser:"..userId))
			   ngx.log(, "校验userid是否在灰度库中 userExists === >",userExists)
			   if (1 == userExists) then
			       ngx.var.target = "grayscale.server"
			   end 
            end
    end
end