安裝包部署
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