1.nginx的location的配置
location /flow1 {
lua_need_request_body on;
lua_code_cache on;
default_type application/json;
#在content阶段,lua中可以调用所有ngx_lua的函数,但不是很适合upstream这种情形。
content_by_lua_file /usr/local/openresty/nginx/conf/vhosts/flowservice.lua;
}
location /flow2 {
error_log /data/log/nginx/flow_error.log;
access_log /data/log/nginx/cntr.log cntr;
lua_need_request_body on;
lua_code_cache on;
default_type application/json;
set $proxyhost "wps_cntr";
rewrite_by_lua_file /usr/local/openresty/nginx/conf/vhosts/flowservice.lua; #Rewrite阶段是不允许带参数的。
#return 200, $proxyhost; #当使用return时,是会导致rewrite的lua不会被调用。可能是因为return函数的关系,被系统优先调用而忽略了lua文件的调用。
proxy_pass http://$proxyhost; #默认情况下是调用wps_cntr的,由于flowserice的影响,会调用ngx.var.proxyhost="wps_flow"的。
}
location /flow3 {
lua_need_request_body on;
lua_code_cache on;
default_type application/json;
set $cntr_old "wps_cntr";
set $cntr_new "wps_flow";
# set阶段,不能使用ngx.req.read_body的函数,这个是ngx_lua的强制需求。
set_by_lua_file $proxyhost /usr/local/openresty/nginx/conf/vhosts/flowservice.lua $cntr_old $cntr_new; #这情况是允许带参数的。
return 200 $proxyhost
}
2.相应flowservice.lua的脚本编写
local json_module = os.getenv("JSON_MODULE") or "cjson"
local json = require(json_module)
local g_plugin = {}
g_plugin["Kaiwpp"] = true
g_plugin["onekeyanimation"] = true
local function find_func(mod, funcnames)
for _, v in ipairs(funcnames) do
if mod[v] then
return mod[v]
end
end
return nil
end
local json_encode = find_func(json, { "encode", "Encode", "to_string", "stringify", "json" })
local json_decode = find_func(json, { "decode", "Decode", "to_value", "parse" })
local function get_query_string()
local method = ngx.var.request_method
if "GET" == method then
local args = ngx.req.get_uri_args()
return args['query']
elseif "POST" == method then
ngx.req.read_body()
local headers = ngx.req.get_headers()
if headers['content-type'] == 'application/json' then
local data = ngx.req.get_body_data()
if data == nil then
return nil
end
local args = json_decode(data)
if args then
return args['query']
end
return nil
end
local args = ngx.req.get_post_args()
return args['query']
end
end
local q = get_query_string()
if q then
local query = json_decode(q)
if query then
local pn = query[1]
if pn then
local name = pn['plug_name']
if name then
if g_plugin[name] then
ngx.var.proxyhost="wps_flow"
end
end
end
end
end
ngx.log(ngx.INFO, "abc")
3.检验结果的方式。
A.lua脚本运行出错,看error.log可以看出出错原因。
B.ngx.log来打印,ngx.log默认是打印至err_log的地方。
C.lua运行正常,可以通过access_log来看。特别是upstream的模式,access_log的格式需要包括$upstream_addr的参数。
config配置
error_log
access_log