From b69d850757a7a8c4ff9a368df004a3cfaaf9f1e4 Mon Sep 17 00:00:00 2001 From: Zhaoxing Date: Thu, 8 Sep 2016 23:20:06 +0800 Subject: Issue-id: OCS-9 Change-Id: I73c18bdda656c43687810930338f9a949ed08848 Signed-off-by: Zhaoxing --- .../resources/openresty/nginx/luaext/auth.lua | 15 -- .../openresty/nginx/luaext/customrouter.lua | 194 +++++++++++++++++++++ .../resources/openresty/nginx/luaext/iui_auth.lua | 41 ----- .../resources/openresty/nginx/luaext/login.lua | 9 - .../resources/openresty/nginx/luaext/logout.lua | 6 - .../openresty/nginx/luaext/make_authed.lua | 44 ----- .../openresty/nginx/luaext/openoadminrouter.lua | 110 ++++++++++++ .../openresty/nginx/luaext/openoapijsonrouter.lua | 110 ++++++++++++ .../openresty/nginx/luaext/openoapirouter.lua | 117 +++++++++++++ .../openresty/nginx/luaext/openouirouter.lua | 115 ++++++++++++ .../openresty/nginx/luaext/serviceaccess.lua | 15 -- .../openresty/nginx/luaext/setnocacheflag.lua | 29 +++ 12 files changed, 675 insertions(+), 130 deletions(-) delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/auth.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/iui_auth.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/login.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/logout.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/make_authed.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoadminrouter.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapijsonrouter.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapirouter.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/serviceaccess.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/setnocacheflag.lua (limited to 'msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext') diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/auth.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/auth.lua deleted file mode 100644 index 067c277..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/auth.lua +++ /dev/null @@ -1,15 +0,0 @@ -local cache = ngx.shared.ceryx -local client_ip = ngx.var.remote_addr -local host = ngx.var.host -if client_ip == '127.0.0.1' or client_ip == host or client_ip == ngx.var.server_addr then - return -end -local succ, err, forcible = cache:replace(client_ip, "place_holder", 3600) -if not succ then - if err == 'not found' then - ngx.log(ngx.WARN, "access record not found for "..client_ip) - ngx.exit(401) - else - ngx.log(ngx.WARN, err) - end -end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua new file mode 100644 index 0000000..d1f476a --- /dev/null +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua @@ -0,0 +1,194 @@ +--[[ + + Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Author: Zhaoxing Meng + email: meng.zhaoxing1@zte.com.cn + +]] +-- put red into the connection pool of size 100, +-- with 10 seconds max idle time +local function close_redis(red) + if not red then + return + end + --release connection to the pool + local pool_max_idle_time = 10000 + local pool_size = 100 + local ok, err = red:set_keepalive(pool_max_idle_time, pool_size) + if not ok then + ngx.log(ngx.ERR, "set keepalive error:", err) + end + return +end + +local function query_ipurl_updatecache(red,key) + local keyprefix = "msb:routing:custom:"..key + + + local infokey=keyprefix..":info" + -- first of all check whether the status is 1(enabled) + local status = red:hget(infokey,"status") + if not (status=="1") then + ngx.log(ngx.WARN, key.."is disabled.status=", status) + return nil + end + + -- Try to get url for key + local url, err = red:hget(infokey,"url") + ngx.log(ngx.WARN, "==url:", url) + if not url or url == ngx.null then + return nil + end + + -- Try to get ip:port for key + local serverkey=keyprefix..":lb:server1" + local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port") + ngx.log(ngx.WARN, "==server:", server) + if not server or server == ngx.null then + return nil + end + + -- get the local cache + local cache = ngx.shared.ceryx + local uri = ngx.var.uri + -- Save found key to local cache for 5 seconds + cache:set("custom:key:"..uri,key,5) + cache:set("custom:server:"..uri,server,5) + cache:set("custom:url:"..uri,url,5) + + ngx.var.key = key + ngx.var.server = server + ngx.var.url = url + return true +end + +local function query_allkeys_updatecache(red) + -- Try to get all keys start with "msb:routing:custom:" + local allkeys, err = red:keys("msb:routing:custom:*") + if not allkeys or allkeys == ngx.null then + ngx.log(ngx.ERR,err) + return "" + end + --把所有键值处理后放到集合中,去除重复 + local key_set={} + for key, value in ipairs(allkeys) do + name = string.gsub(string.gsub(string.gsub(value,"msb:routing:custom:",""),":info",""),":lb:server1","") + key_set[name]=true + end + --取出所有的�?放到table中准备排�? + local key_table = {} + local index = 1 + for key,_ in pairs(key_set) do + --为了避免效率问题,暂时不用table.insert() + --table.insert(key_table,key) + key_table[index] = key + index = index + 1 + end + --对所有键进行倒序排序,用于实现最长前缀匹配 + table.sort(key_table, function (a, b) + return a > b + end) + + local servicenames = "" + local delimiter = "<>" + for i=1,#key_table do + servicenames=servicenames..key_table[i]..delimiter + end + + -- get the local cache + local cache = ngx.shared.ceryx + -- Save all keys to local cache for 30 seconds(0.5 minutes) + cache:set("customrouter:allkeys", servicenames, 30) + return servicenames; +end + +local function query_router_info() + local uri = ngx.var.uri + ngx.log(ngx.WARN, "==uri:", uri) + + -- Check if key exists in local cache + local cache = ngx.shared.ceryx + local key, flags = cache:get("custom:key:"..uri) + local server, flags = cache:get("custom:server:"..uri) + local url, flags = cache:get("custom:url:"..uri) + if key and server and url then + ngx.var.key = key + ngx.var.server = server + ngx.var.url = url + ngx.log(ngx.WARN, "==using custom cache:", key.."&&"..server.."&&"..url) + return + end + + local redis = require "resty.redis" + local red = redis:new() + red:set_timeout(1000) -- 1000 ms + local redis_host = "127.0.0.1" + local redis_port = 6379 + local res, err = red:connect(redis_host, redis_port) + + -- Return if could not connect to Redis + if not res then + ngx.log(ngx.ERR, "connect to redis error:", err) + return + end + + -- Check if all servicenames exists in local cache + local servicenames, flags = cache:get("customrouter:allkeys") + if servicenames then + ngx.log(ngx.WARN,"==get all keys from cache:",servicenames) + else + servicenames = query_allkeys_updatecache(red) + end + + local delimiter = "<>" + -- '.-' 表示最短匹�? + for key in string.gmatch(servicenames,"(.-)"..delimiter) do + ngx.log(ngx.WARN, "==key_table key:", key) + local from, to, err = ngx.re.find(uri, "^"..key.."(/(.*))?$", "jo") + --判断key是否为输入uri�?前缀" + if from then + ngx.log(ngx.WARN,"Matched! start-end:",from,"-",to) + local result = query_ipurl_updatecache(red,key) + if result then + break + end + else + ngx.log(ngx.WARN,"not Matched") + if err then + ngx.log(ngx.WARN,"ngx.re.find throw error: ",err) + return + end + end + end + + return close_redis(red) +end + +local function rewrite_router_url() + local server=ngx.var.server + if server=="fallback" then + ngx.status = ngx.HTTP_NOT_FOUND + ngx.exit(ngx.status) + end + local url=ngx.var.url + local key=ngx.var.key + local rewriteduri = ngx.re.sub(ngx.var.uri, "^"..key.."(.*)", url.."$1", "o") + ngx.log(ngx.WARN, "==rewrited uri:", rewriteduri) + ngx.req.set_uri(rewriteduri) +end + +query_router_info() +rewrite_router_url() \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/iui_auth.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/iui_auth.lua deleted file mode 100644 index dd7b2ed..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/iui_auth.lua +++ /dev/null @@ -1,41 +0,0 @@ -local cache = ngx.shared.ceryx -local client_ip = ngx.var.remote_addr -local uri = ngx.var.uri -if uri == "/iui/framework/login.html" then - local value, flags = cache:get(client_ip) - if not value then - return - else - ngx.redirect("/iui/framework/main-page.html") - end -end - -local referer = ngx.var.http_referer -local refererList = { - "/iui/framework/login.html", - "/iui/framework/css/login.css", - "/iui/component/thirdparty/font%-awesome/css/font%-awesome.min.css", - "/iui/framework/css/style%-custom.css" -} -local function referer_matches(t, r) - for k,_ in pairs(t) do - if string.match(r, t[k]) then - return true - end - end - return false -end - -if referer and referer_matches(refererList, referer) then - return -end - -local succ, err, forcible = cache:replace(client_ip, "place_holder", 3600) -if not succ then - if err == 'not found' then - ngx.log(ngx.WARN, "access record not found for "..client_ip..",redirect to login page") - ngx.redirect("/iui/framework/login.html") - else - ngx.log(ngx.WARN, err) - end -end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/login.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/login.lua deleted file mode 100644 index 7d6bfd8..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/login.lua +++ /dev/null @@ -1,9 +0,0 @@ -local h = ngx.resp.get_headers() -if h["openoauth"] and h["openoauth"] == "true" then - local cache = ngx.shared.ceryx - local client_ip = ngx.var.remote_addr - local succ, err, forcible = cache:set(client_ip, "place_holder", 3600) - if not succ then - ngx.log(ngx.WARN, err) - end -end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/logout.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/logout.lua deleted file mode 100644 index e23f787..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/logout.lua +++ /dev/null @@ -1,6 +0,0 @@ -local cache = ngx.shared.ceryx -local client_ip = ngx.var.remote_addr -local succ, err, forcible = cache:delete(client_ip) -if not succ then - ngx.log(ngx.WARN, err) -end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/make_authed.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/make_authed.lua deleted file mode 100644 index c4c2d78..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/make_authed.lua +++ /dev/null @@ -1,44 +0,0 @@ -function ipValidator(ip) - local chunks = {ip:match("(%d+)%.(%d+)%.(%d+)%.(%d+)")} - if #chunks == 4 then - for _,v in pairs(chunks) do - if tonumber(v) > 255 then return R.STRING end - end - return true - end - local chunks = {ip:match(("([a-fA-F0-9]*):"):rep(8):gsub(":$","$"))} - if #chunks == 8 then - for _,v in pairs(chunks) do - if #v > 0 and tonumber(v, 16) > 65535 then return R.STRING end - end - return true - end - return false -end - -if ngx.req.get_method() == "POST" then - ngx.req.read_body() - local body = ngx.req.get_body_data() - local json = require('cjson') - local tab = json.decode(body) - local ip = tab["passIp"] - if not ip then - ngx.log(ngx.WARN, "ip is nil.") - ngx.exit(500) - end - if ipValidator(ip) then - local cache = ngx.shared.ceryx - local succ, err, forcible = cache:set(ip, "place_holder", 3600) - if not succ then - ngx.log(ngx.WARN, err) - ngx.exit(500) - end - else - ngx.log(ngx.WARN, "not a valid ip.") - ngx.exit(500) - end - ngx.exit(201) -else - ngx.log(ngx.WARN, "not a POST request.") - ngx.exit(500) -end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoadminrouter.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoadminrouter.lua new file mode 100644 index 0000000..d2f0895 --- /dev/null +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoadminrouter.lua @@ -0,0 +1,110 @@ +--[[ + + Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Author: Zhaoxing Meng + email: meng.zhaoxing1@zte.com.cn + +]] +-- put red into the connection pool of size 100, +-- with 10 seconds max idle time +local function close_redis(red) + if not red then + return + end + --release connection to the pool + local pool_max_idle_time = 10000 + local pool_size = 100 + local ok, err = red:set_keepalive(pool_max_idle_time, pool_size) + if not ok then + ngx.log(ngx.ERR, "set keepalive error:", err) + end + return +end + +local function rewrite_admin_url() + local apiserver=ngx.var.apiserver + if apiserver=="fallback" then + ngx.status = ngx.HTTP_NOT_FOUND + ngx.exit(ngx.status) + end + local adminurl=ngx.var.adminurl + local uri = ngx.re.sub(ngx.var.uri, "^/admin/([^/]+)(/[Vv][^/]*)?(.*)", adminurl.."$3", "o") + ngx.req.set_uri(uri) +end + +local function query_admin_info() + local apiserver = ngx.var.apiserver + local apiname = ngx.var.apiname + local apiversion = ngx.var.apiversion + apiversion=string.sub(apiversion,2,string.len(apiversion)) + + -- Check if key exists in local cache + local cache = ngx.shared.ceryx + local server, flags = cache:get("server:admin:"..apiname..":"..apiversion) + local url, flags = cache:get("url:admin:"..apiname..":"..apiversion) + if server and url then + ngx.var.apiserver = server + ngx.var.adminurl = url + ngx.log(ngx.WARN, "==using admin cache:", server.."&&"..url) + return + end + + local redis = require "resty.redis" + local red = redis:new() + red:set_timeout(1000) -- 1000 ms + local redis_host = "127.0.0.1" + local redis_port = 6379 + local res, err = red:connect(redis_host, redis_port) + + -- Return if could not connect to Redis + if not res then + ngx.log(ngx.ERR, "connect to redis error:", err) + return + end + + -- Construct Redis key + local prefix = "msb" + local keyprefix = prefix..":routing:api:"..apiname..":"..apiversion + + + -- Try to get ip:port for apiname + local serverkey=keyprefix..":lb:server1" + local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port") + ngx.log(ngx.WARN, "==adminserver:", server) + if not server or server == ngx.null then + return close_redis(red) + end + + -- Try to get admin url for apiname + local infokey=keyprefix..":info" + local url, err = red:hget(infokey,"metricsUrl") + ngx.log(ngx.WARN, "==adminurl:", url) + if not url or url == ngx.null then + return close_redis(red) + end + + -- Save found key to local cache for 5 seconds + cache:set("server:admin:"..apiname..":"..apiversion, server, 5) + cache:set("url:admin:"..apiname..":"..apiversion, url, 5) + + ngx.log(ngx.WARN, "==admin result:", server.."&&"..url) + ngx.var.apiserver = server + ngx.var.adminurl = url + + return close_redis(red) +end +query_admin_info() +rewrite_admin_url() \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapijsonrouter.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapijsonrouter.lua new file mode 100644 index 0000000..1a061f0 --- /dev/null +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapijsonrouter.lua @@ -0,0 +1,110 @@ +--[[ + + Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Author: Zhaoxing Meng + email: meng.zhaoxing1@zte.com.cn + +]] +-- put red into the connection pool of size 100, +-- with 10 seconds max idle time +local function close_redis(red) + if not red then + return + end + --release connection to the pool + local pool_max_idle_time = 10000 + local pool_size = 100 + local ok, err = red:set_keepalive(pool_max_idle_time, pool_size) + if not ok then + ngx.log(ngx.ERR, "set keepalive error:", err) + end + return +end + +local function rewrite_apijson_url() + local apiserver=ngx.var.apiserver + if apiserver=="fallback" then + ngx.status = ngx.HTTP_NOT_FOUND + ngx.exit(ngx.status) + end + local apijsonurl=ngx.var.apijsonurl + local uri = ngx.re.sub(ngx.var.uri, "^/apijson/([^/]+)(/[Vv][^/]*)?(.*)", apijsonurl.."$3", "o") + ngx.req.set_uri(uri) +end + +local function query_apijson_info() + local apiserver = ngx.var.apiserver + local apiname = ngx.var.apiname + local apiversion = ngx.var.apiversion + apiversion=string.sub(apiversion,2,string.len(apiversion)) + + -- Check if key exists in local cache + local cache = ngx.shared.ceryx + local server, flags = cache:get("server:apijson:"..apiname..":"..apiversion) + local url, flags = cache:get("url:apijson:"..apiname..":"..apiversion) + if server and url then + ngx.var.apiserver = server + ngx.var.apijsonurl = url + ngx.log(ngx.WARN, "==using apijson cache:", server.."&&"..url) + return + end + + local redis = require "resty.redis" + local red = redis:new() + red:set_timeout(1000) -- 1000 ms + local redis_host = "127.0.0.1" + local redis_port = 6379 + local res, err = red:connect(redis_host, redis_port) + + -- Return if could not connect to Redis + if not res then + ngx.log(ngx.ERR, "connect to redis error:", err) + return + end + + -- Construct Redis key + local prefix = "msb" + local keyprefix = prefix..":routing:api:"..apiname..":"..apiversion + + + -- Try to get ip:port for apiname + local serverkey=keyprefix..":lb:server1" + local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port") + ngx.log(ngx.WARN, "==apijsonserver:", server) + if not server or server == ngx.null then + return close_redis(red) + end + + -- Try to get apijson url for apiname + local infokey=keyprefix..":info" + local url, err = red:hget(infokey,"apijson") + ngx.log(ngx.WARN, "==apijsonurl:", url) + if not url or url == ngx.null then + return close_redis(red) + end + + -- Save found key to local cache for 5 seconds + cache:set("server:apijson:"..apiname..":"..apiversion, server, 5) + cache:set("url:apijson:"..apiname..":"..apiversion, url, 5) + + ngx.log(ngx.WARN, "==apijson result:", server.."&&"..url) + ngx.var.apiserver = server + ngx.var.apijsonurl = url + + return close_redis(red) +end +query_apijson_info() +rewrite_apijson_url() \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapirouter.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapirouter.lua new file mode 100644 index 0000000..9dec2a9 --- /dev/null +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapirouter.lua @@ -0,0 +1,117 @@ +--[[ + + Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Author: Zhaoxing Meng + email: meng.zhaoxing1@zte.com.cn + +]] +-- put red into the connection pool of size 100, +-- with 10 seconds max idle time +local function close_redis(red) + if not red then + return + end + --release connection to the pool + local pool_max_idle_time = 10000 + local pool_size = 100 + local ok, err = red:set_keepalive(pool_max_idle_time, pool_size) + if not ok then + ngx.log(ngx.ERR, "set keepalive error:", err) + end + return +end + +local function rewrite_api_url() + local apiserver=ngx.var.apiserver + if apiserver=="fallback" then + ngx.status = ngx.HTTP_NOT_FOUND + ngx.exit(ngx.status) + end + local apiurl=ngx.var.apiurl + local uri = ngx.re.sub(ngx.var.uri, "^/openoapi/([^/]+)(/[Vv][^/]*)?(.*)", apiurl.."$3", "o") + ngx.req.set_uri(uri) +end + +local function query_api_info() + local apiserver = ngx.var.apiserver + local apiname = ngx.var.apiname + local apiversion = ngx.var.apiversion + apiversion=string.sub(apiversion,2,string.len(apiversion)) + + -- Check if key exists in local cache + local cache = ngx.shared.ceryx + local server, flags = cache:get("server:api:"..apiname..":"..apiversion) + local url, flags = cache:get("url:api:"..apiname..":"..apiversion) + if server and url then + ngx.var.apiserver = server + ngx.var.apiurl = url + ngx.log(ngx.WARN, "==using api cache:", server.."&&"..url) + return + end + + local redis = require "resty.redis" + local red = redis:new() + red:set_timeout(1000) -- 1000 ms + local redis_host = "127.0.0.1" + local redis_port = 6379 + local res, err = red:connect(redis_host, redis_port) + + -- Return if could not connect to Redis + if not res then + ngx.log(ngx.ERR, "connect to redis error:", err) + return + end + + -- Construct Redis key + local prefix = "msb" + local keyprefix = prefix..":routing:api:"..apiname..":"..apiversion + + local infokey=keyprefix..":info" + -- first of all check whether the status is 1(enabled) + local status = red:hget(infokey,"status") + if not (status=="1") then + ngx.log(ngx.WARN, keyprefix.."is disabled.status=", status) + return close_redis(red) + end + + -- Try to get url for apiname + local url, err = red:hget(infokey,"url") + ngx.log(ngx.WARN, "==url:", url) + if not url or url == ngx.null then + return close_redis(red) + end + + -- Try to get ip:port for apiname + local serverkey=keyprefix..":lb:server1" + local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port") + ngx.log(ngx.WARN, "==server:", server) + if not server or server == ngx.null then + return close_redis(red) + end + + + -- Save found key to local cache for 5 seconds + cache:set("server:api:"..apiname..":"..apiversion, server, 5) + cache:set("url:api:"..apiname..":"..apiversion, url, 5) + + ngx.log(ngx.WARN, "==api result:", server.."&&"..url) + ngx.var.apiserver = server + ngx.var.apiurl = url + + return close_redis(red) +end +query_api_info() +rewrite_api_url() \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua new file mode 100644 index 0000000..736aacd --- /dev/null +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua @@ -0,0 +1,115 @@ +--[[ + + Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Author: Zhaoxing Meng + email: meng.zhaoxing1@zte.com.cn + +]] +-- put red into the connection pool of size 100, +-- with 10 seconds max idle time +local function close_redis(red) + if not red then + return + end + --release connection to the pool + local pool_max_idle_time = 10000 + local pool_size = 100 + local ok, err = red:set_keepalive(pool_max_idle_time, pool_size) + if not ok then + ngx.log(ngx.ERR, "set keepalive error:", err) + end + return +end + +local function rewrite_iui_url() + local iuiserver=ngx.var.iuiserver + if iuiserver=="fallback" then + ngx.status = ngx.HTTP_NOT_FOUND + ngx.exit(ngx.status) + end + local iuiurl=ngx.var.iuiurl + local uri = ngx.re.sub(ngx.var.uri, "^/openoui/([^/]+)(.*)", iuiurl.."$2", "o") + ngx.req.set_uri(uri) +end + +local function query_iui_info() + local iuiserver = ngx.var.iuiserver + local iuiname = ngx.var.iuiname + + -- Check if key exists in local cache + local cache = ngx.shared.ceryx + local server, flags = cache:get("server:iui:"..iuiname) + local url, flags = cache:get("url:iui:"..iuiname) + if server and url then + ngx.var.iuiserver = server + ngx.var.iuiurl = url + ngx.log(ngx.WARN, "==using iui cache:", server.."&&"..url) + return + end + + local redis = require "resty.redis" + local red = redis:new() + red:set_timeout(1000) -- 1000 ms + local redis_host = "127.0.0.1" + local redis_port = 6379 + local res, err = red:connect(redis_host, redis_port) + + -- Return if could not connect to Redis + if not res then + ngx.log(ngx.ERR, "connect to redis error:", err) + return + end + + -- Construct Redis key + local prefix = "msb" + local keyprefix = prefix..":routing:iui:"..iuiname + + local infokey=keyprefix..":info" + -- first of all check whether the status is 1(enabled) + local status = red:hget(infokey,"status") + if not (status=="1") then + ngx.log(ngx.WARN, keyprefix.."is disabled.status=", status) + return close_redis(red) + end + + -- Try to get url for iuiname + local url, err = red:hget(infokey,"url") + ngx.log(ngx.WARN, "==url:", url) + if not url or url == ngx.null then + return close_redis(red) + end + + -- Try to get ip:port for iuiname + local serverkey=keyprefix..":lb:server1" + local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port") + ngx.log(ngx.WARN, "==server:", server) + if not server or server == ngx.null then + return close_redis(red) + end + + + -- Save found key to local cache for 5 seconds + cache:set("server:iui:"..iuiname, server, 5) + cache:set("url:iui:"..iuiname, url, 5) + + ngx.log(ngx.WARN, "==iui result:", server.."&&"..url) + ngx.var.iuiserver = server + ngx.var.iuiurl = url + + return close_redis(red) +end +query_iui_info() +rewrite_iui_url() \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/serviceaccess.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/serviceaccess.lua deleted file mode 100644 index 1118341..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/serviceaccess.lua +++ /dev/null @@ -1,15 +0,0 @@ -if ngx.req.get_method() == "GET" then - local services = { - {serviceName="odlsdnia",apiJson="/api/odlsdnia/v1/swagger.json"}, - {serviceName="roc",apiJson="/api/roc/v1/swagger.json"}, - {serviceName="tackeria",apiJson="/api/tackeria/v1/swagger.json"}, - {serviceName="etsi",apiJson="/api/etsiia/v1/swagger.json"} - } - local cjson = require "cjson" - local jsonData = cjson.encode(services) - jsonData = string.gsub(jsonData,"\\/","/") - ngx.print(jsonData) -else - ngx.log(ngx.WARN, "not a GET request.") - ngx.exit(500) -end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/setnocacheflag.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/setnocacheflag.lua new file mode 100644 index 0000000..e8c75cd --- /dev/null +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/setnocacheflag.lua @@ -0,0 +1,29 @@ +--[[ + + Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Author: Zhaoxing Meng + email: meng.zhaoxing1@zte.com.cn + +]] +local from, to, err = ngx.re.find(ngx.var.uri, "\\.(gif|jpg|jpeg|png|bmp|ico)$", "jo") +--Based on the request file type to determine whether to cache +if from then + --use cache + return 0 +else + --do not use cache + return 1 +end \ No newline at end of file -- cgit 1.2.3-korg