5.5 subrequest执行过程中的主要场景
在使用subrequest时,需要了解下面3个场景:
❑启动subrequest后子请求是如何运行的。
❑子请求如何存放接收到的响应。
❑子请求结束时如何回调处理方法,以及激活父请求的处理方法。
下面根据序列图来说明这3个场景。
5.5.1 如何启动subrequest
处理父请求的过程中会创建子请求,在父请求的处理方法返回NGX_DONE后,HTTP框架会开始执行子请求,如图5-6所示。
图 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主循环。