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