gpt4 book ai didi

nginx - 在nginx中使用Lua将请求传递给FastCGI

转载 作者:行者123 更新时间:2023-12-03 09:27:01 25 4
gpt4 key购买 nike

使用支持 Lua 编译的 nginx,我们如何向 FastCGI 处理程序发出某种子请求,就像 nginx 的 fastcgi_pass 指令一样?

我想做的是这样的:

location = / {
access_by_lua '
res = ngx_fastcgi.pass("backend")
';
}

(显然,这是行不通的。)

我倾倒在HttpLuaModule我看到提到 ngx_fastcgingx.location.capture ,这显然使得

non-blocking internal requests to other locations configured with disk file directory or any other nginx C modules like ... ngx_fastcgi, ...

但随后点击 ngx_fastcgi 链接将我带到 HttpFastcgiModule它仅解释 nginx 指令,而不解释 Lua 脚本命令。 ngx.location.capture 是正确使用的函数吗? (顺便说一句,这些请求将发送到 localhost,只是在不同的端口上,例如 9000 或 9001。)

如何在 nginx 中使用 Lua 将请求转发或发出子请求到 FastCGI 端点?

最佳答案

使用 ngx.location.capture() 方法对预定义的位置 block 执行子请求。然后,从位置 block 内执行外部 FastCGI 请求。由于子请求本身实际上并不是网络操作,而是纯粹在基于 nginx C 的环境中执行,因此开销非常小。此外,由于 FastCGI 请求和其他“proxy_pass”类型请求是基于事件的,因此 nginx 可以作为高效的中介运行。

例如,您可以有以下内容:

location / {
access_by_lua '
response = ngx.location.capture("/my-subrequest-handler")
if response.status == 404 then
return ngx.exit(401) -- can't find/authenticate user, refuse request
end

ngx.say(response.status)
';

# other nginx config stuff here as necessary--perhaps another fastcgi_pass
# depending upon the status code of the response above...
}

location = /my-subrequest-handler {
internal; # this location block can only be seen by nginx subrequests
fastcgi_pass localhost:9000; # or some named "upstream"
fastcgi_pass_request_body off; # send client request body upstream?
fastcgi_pass_request_headers off; # send client request headers upstream?
fastcgi_connect_timeout 100ms; # optional; control backend timeouts
fastcgi_send_timeout 100ms; # same
fastcgi_read_timeout 100ms; # same
fastcgi_keep_conn on; # keep request alive
include fastcgi_params;
}

在上面的示例中,即使我正在对“/my-subrequest-handler”执行子请求,传递给 FastCGI 进程的实际 URL 也是 HTTP 客户端首先调用 nginx 所请求的 URL。

请注意,ngx.location.capture 是一个同步但非阻塞的操作,这意味着您的代码执行将停止,直到收到响应,但 nginx 工作线程可以同时执行其他操作。

您可以使用 Lua 做一些非常酷的事情,以便在 nginx 管道中的任何点修改请求和响应。例如,您可以通过添加 header 、删除 header 甚至转换正文来更改原始请求。也许调用者想要使用 XML,但上游应用程序只能理解 JSON,我们可以在调用上游应用程序时与 JSON 相互转换。

Lua默认没有内置到nginx中。相反,它是必须编译的第 3 方模块。有一种名为 OpenResty 的 nginx 风格。它构建在 Lua+LuaJIT 中以及您可能需要也可能不需要的一些其他模块。

关于nginx - 在nginx中使用Lua将请求传递给FastCGI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18365102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com