nginx lua 在不阻塞请求的情况下进行外部 http 调用

标签 nginx lua

当某些情况发生时,我们需要从 nginx 将事件记录到我们的事件服务器。我知道我可以使用 access_by_lua 进行 http 调用。由于事件记录可能会失败或需要更长的时间,我们不希望请求处理等待 http 操作完成。

如果我使用 lua 访问,则记录所需的时间将被添加到请求时间中。

有没有办法在异步过程中启动事件记录过程,以便请求可以继续,而事件记录可以花时间。

最佳答案

您可以在 content_by_lua_* 中进行通常的处理,并通过 ngx.eof() 明确指定响应输出流的结尾

因此 HTTP 请求将被毫不延迟地处理。

之后你可以做任何你想做的事情,例如使用 cosocket API 或 ngx.location.capture()

https://github.com/openresty/lua-nginx-module#ngxeof

这是文档中的示例:

 location = /async {
     keepalive_timeout 0;
     content_by_lua_block {
         ngx.say("got the task!")
         ngx.eof()  -- well written HTTP clients will close the connection at this point
         -- access MySQL, PostgreSQL, Redis, Memcached, and etc here...
     }
 }

关于nginx lua 在不阻塞请求的情况下进行外部 http 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43337854/

相关文章:

多次调用loadbuffer后的lua行号

variables - 在函数内删除传递给函数的表

c++ - 在链接 lib lua 的 mac os x 上编译动态库导致 "lua: multiple Lua VMs detected"

SSL 证书适用于子域,但不适用于使用 cloudflare 和 certbot 的主域

NGINX auth_request 被忽略

Nginx - Amazon Cloudfront - Gzip 不适用于 JS 文件

lua - 优化Lua以进行循环执行

lua - 为什么 _VERSION 返回 "Luau"而不是 "Lua 5.1"并且为什么 += 运算符突然起作用?

url-rewriting - 用nginx重写所有对index.php的请求

file-upload - nginx 文件使用 proxy_pass 上传流