Openresty: сделать http-вызов с lua и вернуть его проанализированный результат

Моя проблема

Я использую openresty для создания простого сервера.

После вызова этого сервера он должен сделать еще один вызов другому серверу, получить результат JSON, обработать его и вернуть проанализированный результат.

Сервер должен быть реализован в открытом режиме по причинам, выходящим за рамки этого вопроса.


Код

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 [ошибка] 7 # 7: * 1 open () /usr/local/openresty/nginx/htmlhttp://localhost:8080/functions.json не удалось (2: такого файла нет или каталог), клиент: 172.17.0.1, сервер:, запрос: GET / HTTP / 1.1, подзапрос: http: // localhost: 8080 / functions.json, хост: localhost: 8080

Мой вопрос

Как я могу сделать HTTP-запрос GET из блока содержимого Lua в nginx openresty?


person Adam Matan    schedule 11.09.2017    source источник


Ответы (2)


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;
    }
}
person Tarun Lalwani    schedule 11.09.2017
comment
Я пробовал capture в своем коде, но он был обработан как локальный файл (см. Журналы). - person Adam Matan; 11.09.2017
comment
Раньше или сейчас? также попробуйте использовать location = /functions.json {, если мой вам не подошел - person Tarun Lalwani; 11.09.2017
comment
Спасибо, я решил это с помощью сторонней http-библиотеки: https://github.com/pintsized/lua-resty-http - person Adam Matan; 11.09.2017
comment
Да, вы можете это сделать, но это рекомендованный метод от автора модуля nginx lua. См. Проблему github.com/openresty/lua-nginx-module/issues/160 < / а> - person Tarun Lalwani; 11.09.2017

Решено с помощью пакета https://github.com/pintsized/lua-resty-http. Скопировал библиотеку в корень openresty nginx и:

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

local res, err = httpc:request_uri("http://127.0.0.1/functions.json", { method = "GET" })
// Use res.body to access the response
person Adam Matan    schedule 11.09.2017