location ~* /nccloud(.*)\.do$ {
set $appcode '';
set $service '';
rewrite_by_lua_block {
local parameters = split_path(ngx.var.uri)
local server = ""
local bussiness = ""
local appcode = ""
local randservice = ""
--获得请求的headers来判断是否表单请求
local receive_headers = ngx.req.get_headers()
--获取匹配的URI如果是需要随机服务响应的
randservice = isRandomService(ngx.var.uri)
--如果参数为空则url不合法
if(#parameters == 0) then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
--如果参数层级为5层则不进行解析直接往后传
local len = table.getn(parameters)
if (len > 5) then
bussiness = parameters[2]
else
--获取url的匹配是否为平台action
local module = parameters[2]
if receive_headers["transcode"] then
appcode = receive_headers["transcode"]
ngx.log(ngx.ERR, "transcode:"..appcode)
else
--form表单请求的appcode的解析
if (receive_headers["Content-Type"] == "application/x-www-form-urlencoded") then
--未考虑临时缓存问题,大于默认的缓存值则需要从datafile中找数据
local post_args_tab = ngx.req.get_post_args()
appcode = post_args_tab["sys_appcode"]
elseif randservice == false then
local dkjson = require("dkjson")
local data = ngx.req.get_body_data()
local obj, pos, err = dkjson.decode(data, 1, nil)
appcode = obj.sysParamJson.sys_appcode
end
end
--如果为随机服务策略,则随机增加领域标识
if (randservice == true or isSpecialAppCode(appcode)) then
local bussinessServices = {"baseapp"}
if not bussinessServices then
bussiness = module
else
--随机取当前的服务来进行响应
local serviceNum = table.getn(bussinessServices)
math.randomseed(tostring(ngx.now()):reverse():sub(1, 6))
local serviceIndex = math.random(1,serviceNum)
bussiness = bussinessServices[serviceIndex]
ngx.log(ngx.ERR, "URL rewrite random:"..bussiness)
end
else
--如果为平台action则进行body的解析
local platformservice = isPlatformService(ngx.var.uri)
if (platformservice == true) then
if appcode then
local bussinessData = ""
local res = ngx.location.capture('/nccloud/uapbd/platform/pub/queryservicebyAppcode.do',
{
method = ngx.HTTP_POST,
header = header,
args = {transcode = appcode},
body = "{\"sysParamJson\":{\"busiaction\": \"查询appCode对应的服务\"}}"
}
)
if (200 == res.status or 403 == res.status) then
ngx.log(ngx.ERR, "rockzhu res.status"..res.status)
if res.header["service"] then
bussinessData = res.header["service"]
ngx.log(ngx.ERR, "rockzhu res.service"..res.header["service"])
end
end
--如果不存在该服务标识,则默认为模块
if not bussinessData then
bussiness = "baseapp"
else
bussiness = bussinessData
end
else
bussiness = "baseapp"
end
else
nxg.log("URL rewrite failed!")
ngx.exit(404)
end
end
ngx.log(ngx.ERR, "URL rewrite server:"..bussiness)
end
--url进行拼接
for i,v in ipairs(parameters) do
if (i == 2 ) then
server = server .. "/" .. bussiness
end
server = server .. "/" .. v
end
ngx.log(ngx.ERR, "URL relocation server:"..server)
ngx.exec(server)
}
}
1 个回复
nccloud
1、修改nginx.conf
在34-35行添加如下,解决map_hash报错
在66-69行,修改添加如下,当前是注释状态
2、修改conf.d/upstream-tomcat.conf , 大概30-130行,替换整段.do
如果conf.d/upstream-tomcat.conf最后有如下,则删除
另,删除conf.d/upstream-tomcat.conf下的