使用在Lua支持下编译的nginx,我们如何对FastCGI处理程序进行某种子请求,就像nginx的fastcgi_pass指令一样?
我想做的是这样的:
location = / {
access_by_lua '
res = ngx_fastcgi.pass("backend")
';
}
Run Code Online (Sandbox Code Playgroud)
(显然,这是行不通的。)
我在HttpLuaModule上浇注,我看到提到了ngx_fastcgi和ngx.location.capture,这显然使
对配置了磁盘文件目录或其他任何Nginx C模块(例如... ngx_fastcgi,...)的其他位置的非阻塞内部请求
但是随后跟随的链接ngx_fastcgi将我带到HttpFastcgiModule,它仅说明nginx指令,而不说明Lua可编写脚本的命令。是否ngx.location.capture使用正确的功能?(顺便说一下,这些请求将是到达localhost另一个端口,例如9000或9001。)
如何在nginx中使用Lua将请求转发或进行子请求到FastCGI端点?
使用ngx.location.capture()方法执行对预定义位置块的子请求。然后,从位置块中执行外部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;
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,即使我正在执行对“ / my-subrequest-handler”的子请求,传递给FastCGI进程的实际URL也是HTTP客户端首先调用nginx所请求的URL。
请注意,ngx.location.capture是一个同步但非阻塞的操作,这意味着您的代码执行将停止,直到收到响应为止,但同时nginx worker可以自由执行其他操作。
您可以使用Lua进行一些非常酷的操作,以便在nginx管道中的任何时候修改请求和响应。例如,您可以通过添加标头,删除标头甚至转换主体来更改原始请求。也许调用者想使用XML,但是上游应用程序仅了解JSON,我们可以在调用上游应用程序时将其转换为JSON。
Lua默认不是内置在nginx中的。取而代之的是必须在其中编译的第3方模块。有一种叫做OpenResty的nginx ,它在Lua + LuaJIT中以及其他一些您可能需要或不需要的模块中构建。
| 归档时间: |
|
| 查看次数: |
2634 次 |
| 最近记录: |