![](https://img.haomeiwen.com/i6793194/e4c6df670697e4fe.png)
连接部分
1.客户端和服务器通过三次握手,请求连接信息
2.服务器通过客户端发送得ACK
确认链接成功,负载均衡算法选中在服务 器上运行得nginx
的worker
进程进行请求内容处理前的设置
3.nginx
的时间模块收到服务器句柄发送的epoll_wait
事件,接收后分配连接内存池大小(connection_pool_size:初始化512b
)
4.事件模块转到HTTP
模块,通过调用ngx_http_init_connection
方法回调 到epoll_ctl
方法中,添加超时定时器(设置的客户端请求头超时时间client_header_timeout:60s
)
请求部分(一)
1.客户端发送
data
信息给服务器,服务器回应ACK
响应收到请求,同时通过句柄调用nginx
事件模块的epoll_wait
方法
2.事件模块通过回调ngx_http_wait_request_handler
(在连接部分的第四步时设置回调方法)将客户端发送的data
保存HTTP
模块的用户态中,故分配内存(client_header_buffer_size: 1k
内存从连接部分第三步的连接内存池中分配),read
读缓冲区
![](https://img.haomeiwen.com/i6793194/247ae857a9bd75a1.png)
请求部分(二)
在HTTP
模块,到请求上下文分析这里,会接收到分配的1k
或者小于1k
的请求url
信息,需要对整个请求 进行处理
3.根据请求的
url
,分配请求内存池(request_pool_size: 4k
大小根据业务状况来调整,用于分析HTTP
协议,请求header
)
4.状态机解析请求行:包括方法名,url
地址,HTTP
协议
如果url
特别大,超过了client_header_buffer_size
的配置大小,则需要分配大内存large_client_header_buffers 4 8k
(参数的含义即:4 8k
,表示当请求进来分配的client_header_buffer_size 1k
内存不够用的时候,会分配第一个8k
内存给请求使用,这个8k包含之前分配的1k
内存,即剩下7k
内存使用,当第一个8k
不够用的时候,再下一个,,总共可以分配四次8k
内存,总32k
)
5.状态机解析请求行后,标识url
- 通过指针指向这个url
6.状态机开始解析请求header
(cookie
等信息),请求的header
使用的内存也是和请求行一致,两者共用内存
7.解析header
之后 移除在 连接部分-4 设置的 超时定时器(client_header_timeout
)
8.开始进行HTTP
请求处理的11个阶段
注:client_header_buffer_size 默认大小 1k
上下文:http, server
large_client_header_buffers 默认大小 4 8k
上下文:http, server
网友评论