代理通过后如何发出http请求?使用openresty(lua + nginx)

时间:2017-08-23 00:01:11

标签: nginx lua openresty

我对https://github.com/openresty/lua-nginx-module/issues/220

有类似的需求

我的用例

  1. 我使用proxy_pass
  2. 将文件转发到远程服务器
  3. 我需要在代理通过后将$body_bytes_sent传递给远程网址。
  4. 我考虑过content_by_lua阻止,ngx.capture转发到proxy_pass区块,ngx.say()返回来自ngx.capture的内容。随后是$ body_bytes_sent到远程网址的请求。但我需要支持流媒体,这是不可能做到的。文件可能会变得很大,这对ngx.capture()来说很糟糕。
  5. 我考虑过做log_by_lua块,但是cosockets apis被禁用了。 https://github.com/openresty/lua-nginx-module#log_by_lua

1 个答案:

答案 0 :(得分:0)

安装Lua-Curl或其他不依赖于cosockets的库。 (https://github.com/Lua-cURL/Lua-cURLv3

如果你正在使用luarocks(附带openresty),请安装

apt-get install libcurl3 libcurl3-gnutls libcurl4-openssl-dev --yes

luarocks install Lua-cURL

使用log_by_lua(例如log_by_lua_block,log_by_lua_file),就像这样。

# some nginx conf

location /a_location_with_proxy_pass {
    proxy_pass https://example.com:443;
    log_by_lua_file /path/to/luafile.lua;
}

然后,您的log_by_lua_file应该对远程服务器执行curl请求。

local cURL = require 'curl'

curlHandle = cURL.easy{
    url        = 'https://remote_host.com/endpoint',
    post       = true,
    httpheader = {
        'Content-Type: application/json';
    },
    postfields = '{"bytes":' .. ngx.var.body_bytes_sent .. '}'
};
curlHandle:perform();