nginx接受請求連線事件模組流程

2022-04-29 08:42:09 字數 1150 閱讀 4733

作業系統核心:

三次握手,當使用者發來乙個 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請求處理過程.

Nginx事件模組

這是事件模組都必須實現的介面。typedef struct ngx event module t typedef struct ngx event actions t typedef struct ngx event s ngx event t struct ngx event s 其中的最核心的是...

Nginx事件模組init

首先在nginx裡面最重的是下述三個模組 ngx events module,ngx event core module,ngx epoll module,ngx events module這個模組屬於core module在程式起來的時候就init,它的commands成員只有乙個,也就是說只關注...

Nginx限制連線和請求

一.ngx http limit conn module 對同乙個ip server的連線數做限制.配置指令 limit conn zone 語法 limit conn zone variable zone name size 預設值 none 配置段 http veriable 常見取值 a.bi...