原创:https://blog.csdn.net/ndzjx/article/details/89323732
HTTP框架存在的主要目的有两个:
1:针对基于TCP的事件框架解决好HTTP的网络传输、解析、组装等问题。
2:为HTTP模块屏蔽事件驱动架构,使得HTTP模块不需要关心网络事件的处理。
TCP网络事件,可粗略的分为:
可读事件:收到SYN包带来的新连接事件,收到FIN包带来的连接关闭事件,套接子缓冲区上真正收到TCP流。
可写事件:(Nginx提供限速功能,有时可写事件触发时未必可以去发送响应。)
HTTP框架依靠事件机制实现的,完成最主要的4项工作:
1:集成事件驱动机制,管理用户发起的TCP连接,处理网络读写事件,并在定时器中处理请求超时的事件。
2:与各个HTTP模块共同处理请求。
3:允许将一个请求分解为多个子请求。
4:提供基本的工具接口,供HTTP模块使用(如接受HTTP包体,发送HTTP响应头部、响应包体等)
HTTP框架处理请求的第一步在ngx_http_init_connection方法中。新建立连接的可读事件处理方法设置为ngx_http_wait_request_handler。
HTTP框架不会在连接建立成功后就开始初始化请求,而是在连接对应的套接字缓冲区上确实收到了用户发来的请求内容时才进行。
接收HTTP请求行 ngx_http_process_request_line
接受HTTP头部 ngx_http_process_request_headers
处理HTTP请求 ngx_http_process_request/ngx_http_request_handler
ngx_event_t的data指向了ngx_connection_t连接,ngx_connection_t的data指向了ngx_http_request_t结构体。
接收包体 ngx_http_read_client_request_body/ngx_http_read_client_request_body_handler
丢弃包体 ngx_http_discard_request_body
发送HTTP响应:ngx_http_send_header方法(构造HTTP响应行、头部,同时会把他们发送给客户端)和ngx_http_output_filter方法(发送响应包体),这两个方法都会调用ngx_http_write_filter
ngx_http_core_rewrite_phase不会导致跨过同一个HTTP阶段的其他处理方法,就直接跳到下一个阶段来处理请求。rewrite阶段所有的模块时平等的。
HTTP框架要求在请求的某个动作结束时,必须调用ngx_http_finalize_request方法来结束请求。
从底层到上层分别为:
ngx_http_close_connection
ngx_http_free_request
ngx_http_close_request
ngx_http_finalize_connection
ngx_http_terminate_request
ngx_http_finalize_request