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 

posted @   smallzhen  阅读(1432)  评论(1编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示