Openresty log_by_lua_block非阻塞http请求

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

像这样:

location / {
   proxy_pass http://host;

   log_by_lua_block {
          someAsyncCurlRequest(ngx.var)
   }
}
点赞
用户561323
用户561323

看看是否可以使用 ngx.location.capture

它可以让你:

使用URL发出同步但仍非阻塞的Nginx子请求。

从 log_by_lua_block 上下文中似乎不可能这么做。你可以尝试修改你的代码,使用另一个块来执行操作。例如,将逻辑移动到 access_by_lua_block 中以利用协同套接字。

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

2019-08-21 09:54:20
用户6679321
用户6679321
location /proxy/ {
    rewrite /proxy/(.*) /$1  break; // 将 /proxy/$1 重写为 /$1
    allow 127.0.0.1; // 仅允许本地访问
    deny all; // 拒绝其他访问
    proxy_pass $1; // 代理到$urlPath,其中$urlPath=$1
}

log_by_lua_block {
    local cjson = require "cjson.safe"
    local postData = {}
    postData["userIP"] = $remote_addr // 获取用户 IP 地址
    res = ngx.location.capture_multi{{"/proxy/http://urlPath",{ method = ngx.HTTP_POST, body = cjson.encode(postData)}},} // 使用 POST 方法提交数据 {$1}
}
2019-10-10 12:46:17