操作系统内核:
三次握手,当用户发来一个 SYN 报文时,系统内核会返回一个SYN+ACK确认给客户端,当客户端再次发送ACK来的时候,此时就已经建立了三次握手.
完成三次握手后,操作系统会根据系统内的负载均衡算法来选中一个worker线程,它会返回一个建立连接的epoll_wait的连接句柄.
拿到了epoll_wait的连接句柄后找到它监听的端口 80 或 443 等端口.
拿到端口后,开始调用accept方法来分配512字节的连接内存池 (connection_pool_size:512).
分配完内存池后,http模块会从事件中接入请求的处理过程.
http模块启动后,ngx_http_init_connection设置并启用一个回调方法: epoll_ctl, 并为这个方法添加定时器 (client_header_timeout:60s) 然后将读事件添加到这个epoll事件中.并开始计时60s. 如果60秒没收到请求就会返回超时.
在请求完成后,nginx会将请求数据读取到用户态中,并在连接内存池中为他分配一个读的缓冲区: client_header_bufer_size:1k [之前分配的是512字节,这里是可扩展的分配的1k,这里的1k 是强制占用,无论你现有字节会不会超过1k 都会强行占用1k]
接收请求HTTP模块:
收到请求的URI后,开始分配内存池,并做上下文分析,分析每个head和http协议,所以这里需要分配一个默认请求内存池: request_poll_size:4k;
此时状态机会解析请求行,如:方法名,url,协议, 解析请求行的过程中 可能会发现有的URL更大,已经超过了我们之前设置的1k了,此时我们会调用一个大内存: large_client_header_buffers: 4 8k; (最多32k). 当状态机解析完了请求行后,标识URI用于指向请求行(这里也是nginx强大的原因,他可以指定请求行,不用遍历). 标识结束后,开始接受head,并开始解析header,同时复用large_client_header_buffers: 4 8k;的的内存.接收完整的header后,标识header,并且移除超时定时器 (client_header_timeout:60s),移除定时器后就开始了 11 个阶段的http请求处理过程.