系统相关
首页 > 系统相关> > Nginx请求处理流程

Nginx请求处理流程

作者:互联网

Nginx请求处理流程

多种流量进入nginx后,nginx的三种状态机[非阻塞驱动模型epoll]: 传输层状态机,http状态机,mail状态机
在nginx解析出请求后,会动用线程池处理调用,将静态资源,反向代理,错误日志等信息分别导向不同的出口,如: fastcgi会导向php处理,html会导向nginx处理.并将处理的请求记录日志到本地或远程服务器

Nginx接受请求连接事件模块流程

操作系统内核:
三次握手,当用户发来一个 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会将请求数据读取到用户态中,并在连接内存池中为他分配一个读的缓冲区: clent_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,并且移除超时定时器 (clent_header_timeout:60s),移除定时器后就开始了 11 个阶段的http请求处理过程.

标签:http,请求,nginx,流程,header,状态机,Nginx,1k
来源: https://www.cnblogs.com/superlinux/p/12789092.html