• 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 

  • 相关阅读:
    Error: Client network socket disconnected before secure TLS connection was established
    python对文章词频的统计
    IntelliJ IDEA创建java空项目
    java提取docx文件中的图片
    vue v-for 循环复选框-默认勾选第一个的实现方法
    nodejs的request创建的get和post请求,带参数
    python list转换字符串报错TypeError: sequence item 0: expected str instance, int found
    linux常用命令
    ES9(2018) 正则表达式命名捕获组
    ESLint+Prettier代码规范实践
  • 原文地址:https://www.cnblogs.com/smallzhen/p/12634509.html
Copyright © 2020-2023  润新知