Nginx的重要概念之request

Posted smallzhen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx的重要概念之request相关的知识,希望对你有一定的参考价值。

什么是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请求的流程图如下

以上总结参考https://mp.weixin.qq.com/s/bXtI45d7M-XjkJH3ARZiMQ 

以上是关于Nginx的重要概念之request的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis应用开发应用之几个重要概念

大数据之维度建模中的重要概念

大数据之维度建模中的重要概念

LDAP(一)之概念原理介绍

20170804L08-03老男孩Linux实战运维培训-Lamp系列之-http服务重要基础概念讲解

数据库 之 基本概念