Openresty: 使用lua进行http调用并返回解析结果

我的问题

我正在使用openresty构建一个简单的服务器。

调用此服务器时,它应该向不同的服务器发出另一个调用,获取JSON结果,处理它并返回解析后的结果。

由于本问题的范围超出了本问题,因此应在openresty中实现服务器。


代码

error_log /dev/stdout info;

events {
    worker_connections  14096;
}

http {
    access_log off;
    lua_package_path ";;/usr/local/openresty/nginx/?.lua;";

    server {
        keepalive_requests 100000;
        proxy_http_version 1.1;
        keepalive_timeout 10;

        location / {
        content_by_lua_block {
                res = ngx.location.capture('http://localhost:8080/functions.json')
                ngx.say(res.body)
            }
        }

        location /functions {
            root /usr/local/openresty/nginx/html/;
        }

        listen 0.0.0.0:80 default_server;
    }
}

错误日志

2017/09/11 08:27:49 [error] 7#7: *1 open() "/usr/local/openresty/nginx/htmlhttp://localhost:8080/functions.json" failed (2: No such file or directory), client: 172.17.0.1, server: , request: "GET / HTTP/1.1", subrequest: "http://localhost:8080/functions.json", host: "localhost:8080"

我的问题

如何在 nginx openresty 的 Lua 内容块中进行 HTTP GET 请求呢?

点赞
用户2830850
用户2830850

Capture 将允许您捕获内部的 nginx 位置而不是绝对 URL:

error_log /dev/stdout info;

events {
    worker_connections  14096;
}

http {
    access_log off;
    lua_package_path ";;/usr/local/openresty/nginx/?.lua;";

    server {
        keepalive_requests 100000;
        proxy_http_version 1.1;
        keepalive_timeout 10;

        location / {
        content_by_lua_block {
                res = ngx.location.capture('/functions.json')
                ngx.say(res.body)
            }
        }
        location /functions.json {
            proxy_pass http://localhost:8080/functions.json;
        }

        location /functions {
            root /usr/local/openresty/nginx/html/;
        }

        listen 0.0.0.0:80 default_server;
    }
}
2017-09-11 09:09:36
用户51197
用户51197

使用 lua-resty-http 包解决。将库复制到 nginx openresty 根目录,然后:

local http = require "resty.http"
local httpc = http.new()

local res, err = httpc:request_uri("http://127.0.0.1/functions.json", { method = "GET" })
// 使用 res.body 访问响应
2017-09-11 16:20:02