HTTP 連接建立和請求處理過程
HTTP 連接建立和請求處理過程如下:
- Nginx 啟動時,Master 進程,加載配置文件。
- Master 進程,初始化監聽的 Socket。
- Master 進程,Fork 出多個 Worker 進程。
- Worker 進程,競爭新的連接,獲勝方通過三次握手,建立 Socket 連接,並處理請求。
Nginx 高性能、高並發
Nginx 為什么擁有高性能並且能夠支撐高並發?
- Nginx 采用多進程+異步非阻塞方式(IO 多路復用 Epoll)。
- 請求的完整過程:建立連接→讀取請求→解析請求→處理請求→響應請求。
- 請求的完整過程對應到底層就是:讀寫 Socket 事件。
Nginx 的事件處理模型
Request:Nginx 中 HTTP 請求。
基本的 HTTP Web Server 工作模式:
- 接收請求:逐行讀取請求行和請求頭,判斷段有請求體后,讀取請求體。
- 處理請求。
- 返回響應:根據處理結果,生成相應的 HTTP 請求(響應行、響應頭、響應體)。
Nginx 也是這個套路,整體流程一致,只不過nginx內部又細化為了11個函數階段:
Nginx如何處理一個連接
Nginx作為服務器
1 啟動
- 首先,nginx在啟動時,會解析配置文件,得到需要監聽的端口與ip地址
- 然后,nginx的master進程里面,先初始化好這個監控的socket(創建socket--設置addrreuse等選項--綁定到指定的ip地址端口--在listen),然后再fork出多個子進程出來,然后子進程會競爭accept新的連接。
此時,客戶端就可以向nginx發起連接了。
2 客戶端向Nginx發起連接
- 首先:當客戶端與nginx進行三次握手,與nginx建立好一個連接后,此時,某一個子進程會accept成功,得到這個建立好的socket,然后創建nginx對連接的封裝,即ngx_connection_t結構體。
- 其次:設置讀寫事件處理函數並添加讀寫事件來與客戶端進行數據的交互。
- 最后,nginx或客戶端來主動關掉連接。至此,一個連接壽終正寢。
Nginx作為客戶端
Nginx也可以作為客戶端來請求其他server的數據(如upstream模塊),此時與其他server創建連接,所創建的連接也封裝在ngx_connection_t結構體中。作為客戶端:
- 首先:nginx獲取一個ngx_connection_t結構體
- 然后,創建socket,並設置socket屬性(比如非阻塞)
- 之后,通過添加讀寫事件,調用connect/read/write來調用連接
- 最后,關掉連接,釋放ngx_connection_t。