Openresty log_by_lua_block non blocking http-request



在我有一个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)
}    
}

研究使用 ngx.locatin.capture。 它会让你

使用 uri 发出同步但仍然不阻塞的 Nginx 子请求。

似乎从上下文log_by_lua_block可能无法做到这一点。您可以尝试修改代码以使用其他块来执行操作。例如,将逻辑移动到access_by_lua_block以利用协套接字。

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

我这样做了:

location /proxy/ { 
rewrite /proxy/(.*) /$1  break; 
allow 127.0.0.1; 
deny all; 
proxy_pass $1; 
}
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)}},}
}

最新更新