Nginx:HTTP处理流程概述

在这里插入图片描述

  • accept阶段(ngx_http_init_connection):
  1. 分配ngx_http_connection_t结构体;
  2. 根据fd的端口和地址,为hc->addr_conf赋值,以供后续server块查询;
  3. 新的fd加入epoll,设置读超时,超时时间为post_accept_timeout,设置连接可重用。

rev:ngx_http_wait_request_handler (此时没有读取任何数据。) wev:
ngx_http_empty_handler

  • 首次读阶段(ngx_http_wait_request_handler):
  1. 分配c->buffer(cscf->client_header_buffer_size大小)用于存储客户端包头;
  2. recv调用接收包头;
  3. 创建ngx_http_request_t。

rev:ngx_http_process_request_line (循环接收请求行,解析请求行)
wev:ngx_http_empty_handler

  • 请求行阶段(ngx_http_process_request_line):
  1. 循环recv,放入r->header_in(c->buffer);
  2. 解析uri,包括r->uri、r->args、r->exten;
  3. 请求行处理结束。

rev:ngx_http_process_request_headers; (循环接收请求头,解析请求头)
wev:ngx_http_empty_handler

  • 请求头阶段(ngx_http_process_request_headers):
  1. 循环recv,放入r->header_in(c->buffer);
  2. 解析请求头,保存在r->headers_in.headers;
  3. 解析请求头结束后,调用ngx_http_process_request,进行11阶段和子请求处理。

rev:ngx_http_request_handler
——read_event_handler->ngx_http_block_reading (主请求读停止,子请求处理)
wev:ngx_http_request_handler
——write_event_handler->ngx_http_core_run_phases (11阶段,子请求处理)

  • 十一阶段:(读触发)
  1. 在r->content_handler存在情况下,调用content_handler。

rev:ngx_http_request_handler
——read_event_handler->ngx_http_block_reading (子请求处理)
wev:ngx_http_request_handler
——write_event_handler->ngx_http_request_empty_handler (子请求处理)

  • content_handler阶段:(ngx_http_proxy_handler)
  1. 分配ngx_http_upstream_t结构体,并根据上游的协议类型,为upstream分配不同的回调函数,例如:
    create_request:创建上游请求
    process_header:处理上游响应
    finalize_request:结束上游请求
    input_filter_init:input_filter初始化
    input_filter:上游响应的处理函数
  2. 无请求体情况,直接进入上游初始化(ngx_http_upstream_init);
  3. 调用u->create_request将全部请求放入u->request_bufs(ngx_chain_t);
  4. 建立上游连接(ngx_http_upstream_connect)。

rev:ngx_http_upstream_handler
——read_event_handler->ngx_http_upstream_process_header (处理上游响应)
wev:ngx_http_upstream_handler
——write_event_handler->ngx_http_upstream_send_request_handler
(向上游发送请求)

  • request_body_no_buffering=0的情况(缓存请求体):
    1.不调用ngx_http_upstream_init建立上游;
    2.读事件触发请求体接收,直至请求体读取完成;
    3.回调rb->post_handler,即建立上游。

rev:ngx_http_request_handler
——read_event_handler->ngx_http_read_client_request_body_handler(读取过程中)
——read_event_handler->ngx_http_block_reading(读取结束后) (读取请求体)
wev:ngx_http_request_handler
——write_event_handler->ngx_http_request_empty_handler (子请求处理)

  • request_body_no_buffering=1的情况(不缓存请求体):

1.第一次读取结束后,设置r->reading_body = 1;
2.立即建立上游;
3.上游写事件触发时,将判断r->reading_body位,并不断读取请求体并发送至上游,直至请求体读取完成。

rev:ngx_http_request_handler
——read_event_handler->ngx_http_block_reading
(请求体下游读取一次后,后续的请求体不再由下游套接字触发接收,而是由上游的写事件触发。子请求处理)
wev:ngx_http_request_handler
——write_event_handler->ngx_http_request_empty_handler (子请求处理)

  • r->discard_body = 1的情况:

rev:ngx_http_request_handler
——read_event_handler->ngx_http_discarded_request_body_handler
(请求体只读不发) wev:ngx_http_request_handler
——write_event_handler->ngx_http_request_empty_handler (子请求处理)

  • 上游请求发送阶段:(ngx_http_upstream_send_request)
  1. 对于首次请求发送(!u->request_sent),调用ngx_output_chain,发送u->request_bufs和r->request_body->bufs中的请求,直到请求发送完毕;
  2. 非首次发送,只需要发送r->request_body->bufs。
  3. 如果request_body_no_buffering = 0,发送一次就结束。否则,将循环读取下游包体,并循环发送。

rev:ngx_http_upstream_handler
——read_event_handler->ngx_http_upstream_process_header (处理上游响应)
wev:ngx_http_upstream_handler
——write_event_handler->ngx_http_upstream_dummy_handler
(因请求发送完成,所以上游写事件不再处理)

  • 响应头阶段:(ngx_http_upstream_process_header)
    1.循环recv,放入u->buffer;
    2.u->process_header解析响应行和响应头,解析结果保存在u->headers_in;
    3.将响应头放入r->headers_out;
    4.ngx_http_send_header发送响应头。

上游:
——read_event_handler->ngx_http_upstream_process_non_buffered_upstream-读,最终调用函数同下游写 (接收处理发送上游响应体) ——write_event_handler->ngx_http_upstream_dummy_handler
(不处理) 下游: ——read_event_handler->ngx_http_block_reading (不处理)
——write_event_handler->ngx_http_upstream_process_non_buffered_downstream-写,最终调用函数同上游读
(下游发送响应体)

  • 响应体阶段:
    即ngx_http_upstream_process_non_buffered_request调用
    1.循环recv,放入u->buffer;
    2.调用ngx_http_output_filter过滤及发送。

猜你喜欢

转载自blog.csdn.net/u013032097/article/details/91383546
今日推荐