通过Lua进行URL代理
场景:
1.通过Ngx提供统一http接口
2.接收请求后,通过lua和动态代理,实现后端数据请求
3.解析后端Json,响应数据
配置信息:
Nginx、Luajit、Lua库(cjson)、web接口
要点:
Nginx:
- 在当前Server下定义location,请求响应交由lua外部文件处理
- 增加一个用于代理请求的location,配合ngx.location.capture处理响应。
- 配置代理请求使用的upstream server
upstream openService {
server 127.0.0.1:8083;
}
location = /down {
content_by_lua_file lua_res/filelink.lua;
}
location ~ /openurl/(.*) {
internal;
proxy_pass http://openService/$1$is_args$args;
}
请求过程:down?param -> lua -> /openurl -> openService
Lua脚本:
local headers = ngx.req.get_headers()
local supplierUrl="/openurl/service/fileA.json";
local shopUrl="/openurl/service/fileB.json";
local reqUrl;
local uri_args = ngx.req.get_uri_args();
for k, v in pairs(uri_args) do
if k == "app" then
if v=="supplier" then
reqUrl = supplierUrl;
elseif v == "shop" then
reqUrl = shopUrl;
end
end
end
if not reqUrl then
ngx.say("arg error!")
return
end
local resp = ngx.location.capture(reqUrl, {
method = ngx.HTTP_GET,
args = {q = "diy"}
})
if not resp then
ngx.say("request error :", err)
return
end
ngx.log(ngx.ERR, tostring(resp.status))
ngx.header.content_type = "text/plain;charset=UTF-8";
local cjson = require("cjson")
if resp.body then
local versionInfo = cjson.decode(resp.body)
local versionUrl = versionInfo.file.url --只保留部分信息
ngx.say(versionUrl)
end
Cjson:
下载地址:https://www.kyne.com.au/~mark/software/lua-cjson.php
根据手册编译后,把cjson.so库拷贝到lua的相关包目录。
这里使用的luajit,则在:$Install_Path$/luajit/lib/lua/5.1/
*参考信息:http://jinnianshilongnian.iteye.com/blog/2186448