码迷,mamicode.com
首页 > 其他好文 > 详细

Nginx的重要概念之request

时间:2020-04-04 22:25:29      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:hash表   一个   inf   header   parse   lin   回车换行   alt   com   

什么是request?

  request是指Nginx中的http请求,Nginx用结构体ngx_http_request_t对一个http请求进行封装,其中一个http请求包括请求行、请求头、请求体、响应行、响应头、响应体。

webserver是如何处理http请求的?

  http请求是请求-响应类型的网络协议,http是文件协议,我们在分析请求行、请求头和输出响应行与响应头的时候都是一行行处理的。一个普通的http服务器在连接建立好后,接收到客户端发来的请求,它会读取一行数据,分析请求行中的method、uri、http_version等信息,然后再一行行处理请求头,并根据method与请求头信息来决定是否有请求体及请求体的长度,然后再读请求体。当请求产生需要输出的数据,就会生成响应行、响应头和响应体,并将响应发送给客户端。

Nginx是如何处理http请求的?

  与webserver类似,Nginx在请求头读取完成后,通过ngx_http_request_t来保存解析请求与输出响应相关的数据。Nginx的处理请求的步骤如下:

  1. 通过ngx_http_init_request函数初始化请求
  2. 设置读事件为ngx_http_process_request_line函数
  3. 通过ngx_http_read_request_header函数来读取请求数据
  4. 调用ngx_http_parse_request_line函数解析请求行
  5. 将请求行解析到的参数,保存到ngx_http_request_t结构中
  6. 设置读事件为ngx_http_process_request_headers函数,后续的请求就在ngx_http_process_request_headers中进行读取与解析
  7. 通过ngx_http_read_request_header函数读取请求头
  8. 调用ngx_http_parse_request_line函数来解析请求头
  9. 解析到的请求头保存在ngx_http_request_t的域headers_in(一个链表结构,保存所有的请求头,请求头与请求处理函数存放在ngx_http_headers_in映射表里,初始化时会生成hash表,当解析到一个请求头后,就会在hash表里查找,如果有找到,就调用相应的处理函数来处理这个请求头)里
  10. 当解析到两个回车换行符时,请求头结束,调用ngx_http_process_request来处理请求。
  11. ngx_http_process_request设置当前的连接的读写事件处理函数为ngx_http_request_handler(读事件和写事件分别调用ngx_http_request_t中的read_event_handler和write_event_handler)
  12. 调用ngx_http_handler开始真正的处理一个完整的http请求,设置write_event_handler为ngx_http_core_run_phases并执行。
  13. 产生的响应头放在ngx_http_request_t的headers_out中。

注意,Nginx会将请求头放在一个buffer里(buffer大小通过配置项client_header_buffer_size配置),如果请求头过大,Nginx会重新分配一个新的更大的buffer来装请求头(大buffer可以通过large_client_header_buffers设置)。为了保存请求行或请求头的完整性,一个完整的请求头或请求行,需要放在一个连续的内存里面,所以一个完整的请求行或请求头,只会保存在一个buffer。如果请求行大于buffer的大小,会返回414,如果请求头大于buffer大小,会返回400。

根据以上的流程步骤画的Nginx处理http请求的流程图如下

技术图片

 

Nginx的重要概念之request

标签:hash表   一个   inf   header   parse   lin   回车换行   alt   com   

原文地址:https://www.cnblogs.com/smallzhen/p/12634509.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!