31

2025Mar

Cross oceans only by daring to leave shore.

有离开海岸的勇气,才能横渡海洋。

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请求处理过程.

posted @   陈雷雷  阅读(1504)  评论(0编辑  收藏  举报
编辑推荐:
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
阅读排行:
· 2025成都.NET开发者Connect圆满结束
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析
点击右上角即可分享
微信分享提示