【问题标题】:Openresty log_by_lua_block non blocking http-requestOpenresty log_by_lua_block 非阻塞 http-request
【发布时间】:2019-12-18 19:31:24
【问题描述】:
在一个 nginx 位置我有 log_by_lua_block,我需要通过 http 向远程服务器发送几个 ngx.var 变量。如果我使用 Lua-cURL 之类的东西,它会阻止 nginx 工作人员,直到请求完成。从log_by_lua_block 发送非阻塞 http 请求的正确方法是什么?
类似:
location / {
proxy_pass http://host;
log_by_lua_block {
someAsyncCurlRequest(ngx.var)
}
}
【问题讨论】:
标签:
nginx
curl
lua
openresty
【解决方案1】:
考虑使用ngx.locatin.capture。
它会让你
使用 uri 发出一个同步但仍然非阻塞的 Nginx 子请求。
似乎不可能从 log_by_lua_block 上下文中做到这一点。您可以尝试修改代码以使用不同的块来执行操作。例如将逻辑移动到 access_by_lua_block 以利用 co-sockets。
就我个人而言,我会考虑使用不同的方法来解决问题,也许是使用第三方工具来监控日志文件并异步发送数据。这是因为即使执行异步请求仍然可能对 nginx 产生负面影响。
【解决方案2】:
我这样做了:
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)}},}
}