Openresty log_by_lua_block 非阻塞 http 请求

Openresty log_by_lua_block non blocking http-request

在我有 log_by_lua_block 的一个 nginx 位置中,我需要通过 http 将几个 ngx.var 变量发送到远程服务器。如果我使用 Lua-cURL 之类的东西,它会阻止 nginx worker 直到请求完成。从 log_by_lua_block 发送非阻塞 http 请求的正确方法是什么?

类似于:

location / {
   proxy_pass http://host;

   log_by_lua_block {  
          someAsyncCurlRequest(ngx.var)
   }    
}

考虑使用 ngx.locatin.capture。 它会让你

Issue a synchronous but still non-blocking Nginx Subrequest using uri.

似乎无法从 log_by_lua_block 上下文中执行此操作。您可以尝试修改代码以使用不同的块来执行操作。例如,将逻辑移动到 access_by_lua_block 以利用共同插座。

就我个人而言,我会考虑使用不同的方法来解决问题,也许使用第 3 方工具监视日志文件并异步发送数据。这是因为即使执行异步请求仍然可能对 nginx 产生负面影响。

我这样做了:

location /proxy/ { 
    rewrite /proxy/(.*) /  break; 
    allow 127.0.0.1; 
    deny all; 
    proxy_pass ; 
}

log_by_lua_block {  
    local cjson = require "cjson.safe"
    local postData = {}
    postData["userIP"] = $remote_addr
    res = ngx.location.capture_multi{{"/proxy/http://urlPath",{ method = ngx.HTTP_POST, body = cjson.encode(postData)}},}
}