Nginx从入门到精通阅读笔记2

来源:互联网 发布:网络直销怎么做 2017 编辑:程序博客网 时间:2024/05/24 05:23

Request部分

 

Nginx中的http请求对应的数据结构是ngx_http_request_t,这是对一个http请求的封装。Nginx通过它来保存解析请求与输出响应相关的数据。 

一个请求从ngx_http_init_request开始,设置读事件 ngx_http_process_request_line。然后通过ngx_http_read_request_header来读取请求的数据,调用ngx_http_parse_request_line函数来解析请求行。为了提高效率,1)用状态机来解析请求行,2)将四个字符装换成一个整形来比较。

解析完请求行,nginx会设置读事件handler为ngx_http_process_request_headers。Headers_in是ngx_http_request_t的域,是一个链表结构,保存所有的请求头。HTTP中有些请求是需要特别处理的,这些请求头与请求处理函数存放在一个映射表里面,即ngx_http_headers_in,在初始化时,会生成一个hash表,当每解析到一个请求时,就会先在这个hash表中查找,如果找到,就调用相应的处理函数来处理这个请求头。

当nginx解析到两个回车换行符时,就表示请求头的结束,此时就会调用ngx_http_process_request来处理请求。ngx_http_process_request会设置当前连接的读写事件处理函数为ngx_http_request_handler,这个函数中会根据当前事件是读还是写分别调用read_event_handler或者write_event_handler。Nginx的做法是先不读取请求body,所以设置read_event_handler为ngx_http_block_reading,即不读取数据了。然后在ngxz_http_handler里面会设置write_event_handler为ngx_http_core_run_phases,并执行。Nginx将一个http请求的处理分为多个阶段,这个函数就执行这些阶段来产生数据。产生的相应头会放在ngx_http_request_t中的headers_out中。

Nginx的各种阶段会对请求进行处理,最后会调用filter来过滤数据,对数据进行加工。filter是一个链表结构,分别有header filter 和body filter,其中header filter的最后一个filter,即ngx_http_header_filter,这个filter将会遍历所有的相应头,最后输出需要的响应头在一个连续的内存,然后调用ngx_http_write_filter进行输出。Body的情况类似。

 

其它相关概念:

Keep-Alive

Pipe

Lingering_close

0 0
原创粉丝点击