Nginx 的 Connection 的生命周期
我们尝试从一个完整的 Http 处理来解读 Nginx 的 Connection 的生命周期。每个 Http 大致会经过以下几个步骤:
-
ngx_event_accept接受客户端的 TCP 连接。这个处理阶段是对监听 socket 的读请求的响应,并且会在该阶段创建ngx_connection_t对象,然后每个 Nginx 的监听器会将新的连接对象告知给下一个处理阶段。对于 HTTP 连接来说就是ngx_http_init_connection(c) -
ngx_http_init_connection执行 HTTP 连接早期的初始化工作,并且创建ngx_http_connection_t对象,并将该对象作为ngx_connetion_t的 data 成员赋值。代理协议解析以及SSL握手也是在这个阶段开始进行的。 -
ngx_http_wait_request_handler是在 socket 接收到客户端发送数据后触发的,并且在该阶段创建了ngx_http_request_t对象并替换ngx_connection_t的data成员。 -
接下来是
ngx_http_process_request_line阶段,该阶段尝试读取请求行数据,并作为ngx_connection_t的buffer成员赋值。事实上,该buffer也将请求头的数据大小考虑在内, 该 buffer 的大小初始化是由client_header_buffer_size指令控制的,如果不够大,则由large_client_header_buffers指令分配更大的空间 -
接下来自然是
ngx_http_process_request_header阶段。该阶段是由ngx_http_process_request_line设置的下一个处理阶段。 -
ngx_http_core_run_phases阶段是在请求行和请求头都解析完成后执行的。该阶段负责ngx_http_post_read_phase到ngx_http_content_phase的执行过程,最后将请求阶段传递到过滤器中。该阶段还没必要将响应数据吐给客户端,而是将响应数据通过buffer存起来,等待ngx_http_final_request再吐出去。 -
当产生所有的响应数据或者错误数据后,
ngx_http_final_request阶段开始执行,如果在该阶段数据没有完全发送给客户端,那么还需要设置ngx_http_writer来完成最后的数据发送。 -
当所有的响应数据都发送给客户端后,
ngx_http_final_connection开始执行。对于设置有keepalive特性的执行ngx_http_set_keepalive来结束整个请求,并等待下一个请求的到来,否则执行ngx_http_close_connection来结束整个请求和整个连接。