5.5 subrequest执行过程中的主要场景

在使用subrequest时,需要了解下面3个场景:

❑启动subrequest后子请求是如何运行的。

❑子请求如何存放接收到的响应。

❑子请求结束时如何回调处理方法,以及激活父请求的处理方法。

下面根据序列图来说明这3个场景。

5.5.1 如何启动subrequest

处理父请求的过程中会创建子请求,在父请求的处理方法返回NGX_DONE后,HTTP框架会开始执行子请求,如图5-6所示。

5.5 subrequest执行过程中的主要场景 - 图1

图 5-6 subrequest的启动过程序列图

下面简单介绍一下图5-6中的每一个步骤:

1)Nginx主循环中会定期地调用事件模块,检查是否有网络事件发生。

2)事件模块发现这个请求的回调方法属于HTTP框架,交由HTTP框架来处理请求。

3)根据解析完的URI来决定使用哪个location下的模块来处理这个请求。

4)调用mytest模块的ngx_http_mytest_handler方法处理这个请求。

5)设置subrequest子请求的URI及回调方法,这一步以及下面的第6~9步所做的工作参见5.4.4节。

6)调用ngx_http_subrequest方法创建子请求。

7)创建的子请求会添加到原始请求的posted_requests链表中,这样保证第10步时会在父请求返回NGX_DONE的情况下开始执行子请求。

8)ngx_http_subrequest方法执行完毕,子请求创建成功。

9)ngx_http_mytest_handler方法执行完毕,返回NGX_DONE,这样父请求不会被销毁,将等待以后的再次激活。

10)HTTP框架执行完当前请求(父请求)后,检查posted_requests链表中是否还有子请求,如果存在子请求,则调用子请求的write_event_handler方法(详见11.7节)。

11)根据子请求的URI(第5步中建立),检查nginx.conf文件中所有的location配置,确定应由哪个模块来执行子请求。在本章的例子中,子请求是交由反向代理模块执行的。

12)调用反向代理模块的入口方法ngx_http_proxy_handler来处理子请求。

13)由于反向代理模块使用了upstream机制,所以它也要通过许多次的异步调用才能完整地处理完子请求,这时它的入口方法会返回NGX_DONE(非常类似5.1.5节中的内容)。

14)再次检查是否还有子请求,这时会发现已经没有子请求需要执行了。当然,子请求可以继续建立新的子请求,只是这里的反向代理模块不会这样做。

15)当第2步中的网络读取事件处理完毕后,交还控制权给事件模块。

16)当本轮网络事件处理完毕后,交还控制权给Nginx主循环。