听说过服务器自己能召唤“分身”处理任务吗?Nginx的子请求功能就是这样一个神奇的存在。
什么是Nginx子请求?
简单来说,子请求就是Nginx正在处理的请求在内部发起的一种级联请求。它外观上很像HTTP请求,但实现上却和HTTP协议乃至网络通信一点儿关系都没有。
它是Nginx内部的一种抽象调用,目的是方便用户把“主请求”的任务分解为多个较小粒度的“内部请求”,并发或串行地访问多个location接口,共同完成整个“主请求”。
子请求与主请求的关系
在Nginx世界里有两种类型的“请求”:“主请求”(main request)和**“子请求”**(subrequest)。
- 主请求:由HTTP客户端从Nginx外部发起的请求。
- 子请求:由Nginx正在处理的请求在Nginx内部发起的一种级联请求。任何“子请求”也可以再发起更多的“子子请求”,甚至可以玩递归调用(即自己调用自己)。
当一个请求发起一个“子请求”的时候,按照Nginx的术语,习惯把前者称为后者的“父请求”(parent request)。
为什么需要使用子请求?
子请求的核心价值在于解耦复杂逻辑,将一个大任务拆分成多个小任务,让每个location专门负责一件事,符合Unix哲学。
这样做有几个实际好处:
- 提高效率:子请求的执行效率极高,因为它们的通信是在同一个虚拟主机内部进行的,只调用了若干个C函数,完全不涉及任何网络或者UNIX套接字(socket)通信。
- 代码复用:可以将常用功能(如用户认证、数据查询)封装成独立的location,供多个主请求使用。
- 并行处理:可以并发发起多个子请求,同时处理多个任务,大大减少总体响应时间。
- 逻辑清晰:将复杂业务逻辑分解为多个简单步骤,配置更易维护。
在模块中使用子请求的完整示例
基于auth_request模块的访问控制
ngx_http_auth_request_module模块基于子请求的结果实现客户端授权。它默认未构建,需要使用--with-http_auth_request_module配置参数启用。
工作原理:
- 当客户端请求到达配置了
auth_request的location时,Nginx会向指定的URI发起子请求 - 如果子请求返回2xx响应代码,则允许访问
- 如果返回401或403

最低0.47元/天 解锁文章
907

被折叠的 条评论
为什么被折叠?



