5.2 回调方法的执行场景

使用upstream方式时最重要的工作都会在回调方法中实现,为了更好地实现它们,本节将介绍调用这些回调方法的典型场景。

5.2.1 create_request回调方法

create_request的回调场景最简单,即它只可能被调用1次(如果不启用upstream的失败重试机制的话。详见第12章),如图5-3所示。下面简单地介绍一下图5-3中的每一个步骤:

5.2.1 create_request回调方法 - 图1

图 5-3 create_request回调场景的序列图

1)在Nginx主循环(这里的主循环是指8.5节提到的ngx_worker_process_cycle方法)中,会定期地调用事件模块,以检查是否有网络事件发生。

2)事件模块在接收到HTTP请求后会调用HTTP框架来处理。假设接收、解析完HTTP头部后发现应该由mytest模块处理,这时会调用mytest模块的ngx_http_mytest_handler来处理。

3)这里mytest模块此时会完成5.1.2节~5.1.4节中所列出的步骤。

4)调用ngx_http_upstream_init方法启动upstream。

5)upstream模块会去检查文件缓存,如果缓存中已经有合适的响应包,则会直接返回缓存(当然必须是在使用反向代理文件缓存的前提下)。为了让读者方便地理解upstream机制,本章将不再提及文件缓存。

6)回调mytest模块已经实现的create_request回调方法。

7)mytest模块通过设置r->upstream->request_bufs已经决定好发送什么样的请求到上游服务器。

8)upstream模块将会检查5.1.3节中介绍过的resolved成员,如果有resolved成员的话,就根据它设置好上游服务器的地址r->upstream->peer成员。

9)用无阻塞的TCP套接字建立连接。

10)无论连接是否建立成功,负责建立连接的connect方法都会立刻返回。

11)ngx_http_upstream_init返回。

12)mytest模块的ngx_http_mytest_handler方法返回NGX_DONE。

13)当事件模块处理完这批网络事件后,将控制权交还给Nginx主循环。