通过Lua进行URL代理

通过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

留下回复