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