Nginx处理http请求头部流程

主要流程如上图,大致步骤如下:

  1. 三次握手,接受到对方的syn报文,tcp(内核)回复syn+ack,等再次接受对端的ack,内核会根据负责均衡算法选择一个worker处理,然后epoll会将并将刚刚建立的socket句柄交给nginx的事件处理器,事件处理判断是一个建立连接的读事件就进行accept系统调用,此时会给该链接分配连接内存池,默认512B。
  2. accept成功后会触发ngx_http_init_connection回调方法,该回调是在ngx_http_add_listening方法中设置的。
    ls->handler = ngx_http_init_connection;

    在init_connection方法中会将新建连接对应的读写事件通过epoll_ctl系统调用加入到epoll中,并设置一个定时器client_header_timeout,用来保证在指定时间内如果没有收到header就断开连接。

  3. 用户发送请求行和header,内核回复ack,并且epoll_wait拿到fd,开始调用ngx_http_wait_request_handler方法。内核需要将data从内核读缓冲区复制到用户空间读缓冲区,所以该方法会从connection_pool中分配client_header_buffer_size(通常是1k),用来保存数据。同时nginx还会分配一块内存叫做request_pool,用来服务nginx处理请求。
    size = cscf->client_header_buffer_size;
    ngx_palloc(c->pool, size);
  4. 当接收到的uri和header超过1k,nginx还会从request_pool中分配一块large_client_header_buffers内存用开保存更大的用户数据。
  5. 接收到uri后,会接着接受header,所有的header接受完后,会移除之前设置的client_header_timeout。之后就是交给http模块来处理核心逻辑。

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注