連接部分
1.客戶端和服務(wù)器通過三次握手浴捆,請(qǐng)求連接信息
2.服務(wù)器通過客戶端發(fā)送得ACK
確認(rèn)鏈接成功,負(fù)載均衡算法選中在服務(wù) 器上運(yùn)行得nginx
的worker
進(jìn)程進(jìn)行請(qǐng)求內(nèi)容處理前的設(shè)置
3.nginx
的時(shí)間模塊收到服務(wù)器句柄發(fā)送的epoll_wait
事件培遵,接收后分配連接內(nèi)存池大小(connection_pool_size:初始化512b
)
4.事件模塊轉(zhuǎn)到HTTP
模塊,通過調(diào)用ngx_http_init_connection
方法回調(diào) 到epoll_ctl
方法中疚宇,添加超時(shí)定時(shí)器(設(shè)置的客戶端請(qǐng)求頭超時(shí)時(shí)間client_header_timeout:60s
)
請(qǐng)求部分(一)
1.客戶端發(fā)送
data
信息給服務(wù)器,服務(wù)器回應(yīng)ACK
響應(yīng)收到請(qǐng)求赏殃,同時(shí)通過句柄調(diào)用nginx
事件模塊的epoll_wait
方法
2.事件模塊通過回調(diào)ngx_http_wait_request_handler
(在連接部分的第四步時(shí)設(shè)置回調(diào)方法)將客戶端發(fā)送的data
保存HTTP
模塊的用戶態(tài)中敷待,故分配內(nèi)存(client_header_buffer_size: 1k
內(nèi)存從連接部分第三步的連接內(nèi)存池中分配),read
讀緩沖區(qū)
請(qǐng)求部分(二)
在HTTP
模塊仁热,到請(qǐng)求上下文分析這里榜揖,會(huì)接收到分配的1k
或者小于1k
的請(qǐng)求url
信息,需要對(duì)整個(gè)請(qǐng)求 進(jìn)行處理
3.根據(jù)請(qǐng)求的
url
抗蠢,分配請(qǐng)求內(nèi)存池(request_pool_size: 4k
大小根據(jù)業(yè)務(wù)狀況來(lái)調(diào)整举哟,用于分析HTTP
協(xié)議,請(qǐng)求header
)
4.狀態(tài)機(jī)解析請(qǐng)求行:包括方法名迅矛,url
地址妨猩,HTTP
協(xié)議
如果url
特別大,超過了client_header_buffer_size
的配置大小秽褒,則需要分配大內(nèi)存large_client_header_buffers 4 8k
(參數(shù)的含義即:4 8k
壶硅,表示當(dāng)請(qǐng)求進(jìn)來(lái)分配的client_header_buffer_size 1k
內(nèi)存不夠用的時(shí)候,會(huì)分配第一個(gè)8k
內(nèi)存給請(qǐng)求使用震嫉,這個(gè)8k包含之前分配的1k
內(nèi)存森瘪,即剩下7k
內(nèi)存使用,當(dāng)?shù)谝粋€(gè)8k
不夠用的時(shí)候票堵,再下一個(gè)扼睬,,總共可以分配四次8k
內(nèi)存悴势,總32k
)
5.狀態(tài)機(jī)解析請(qǐng)求行后窗宇,標(biāo)識(shí)url
- 通過指針指向這個(gè)url
6.狀態(tài)機(jī)開始解析請(qǐng)求header
(cookie
等信息),請(qǐng)求的header
使用的內(nèi)存也是和請(qǐng)求行一致特纤,兩者共用內(nèi)存
7.解析header
之后 移除在 連接部分-4 設(shè)置的 超時(shí)定時(shí)器(client_header_timeout
)
8.開始進(jìn)行HTTP
請(qǐng)求處理的11個(gè)階段
注:client_header_buffer_size 默認(rèn)大小 1k
上下文:http, server
large_client_header_buffers 默認(rèn)大小 4 8k
上下文:http, server