【Nginx】Nginx 工作原理
Nginx 架構以及工作流程圖
Nginx 在是以守護進程的形式在后臺運行,采用 多線程+異步非阻塞IO事件模型 來處理各種請求。多線程模型包括一個 master 進程,多個 worker 進程,一般 worker 進程個數是根據服務器 CPU 核數來決定的。master 進程負責管理 Nginx 本身和其他 worker 進程。
Master 進程的主要職責
- 讀取并驗證配置信息(nginx.conf)
- 創建,綁定,關閉套接字(IP + PORT)
- 啟動,終止,維護 worker 進程的個數
Worker 進程的主要職責
- 處理連接和請求
- Worker 進程的個數由配置文件決定,一般和 CPU 個數相關,配置幾個就有幾個 Worker 進程。
Nginx 如何實現熱部署
所謂熱部署,就是修改配置文件 nginx.conf 后,不需要重啟 nginx,不需要中斷請求,就能讓配置文件生效。
在修改完配置文件后,會重新生成新的 worker 進程,會以新的配置進行處理請求,而且新的請求也會交給新的 worker 進程處理,老的 worker 進程,會在執行完請求直接關閉。
Nginx 如何做到高并發下的高效處理
Nginx 采用了 Linux 的 epoll 模型,epoll 模型是基于事件驅動機制,它可以監控多個事件是否準備完畢,如果 OK,那么放入 epoll 隊列中,這個過程是異步的。worker 只需要從 epoll 隊列循環處理即可。
Worker 如何處理請求
一個請求由一個 worker 進程處理。
Nginx 在內部維護了一個 accept_mutex,其實就是鎖,確保在某一時刻,一個請求只能被一個 worker 進程捕獲。當一個 worker 進程在 accept 這個連接之后,就開始讀取請求,解析請求,處理請求,產生數據后,再返回給客戶端,最后才斷開連接。
異步/非阻塞/事件驅動
我們知道,很多請求來了,他們大多需要讀寫數據,發生IO請求,此時程序就會發生中斷,如果此時我們一直等待IO調用結束,才繼續工作,那么這種就是阻塞的,那么很顯然很多請求來了,都處于等待狀態,CPU就將處于空閑狀態,為了提供高并發的能力,Nginx采用的是非阻塞的方式。如果發生IO中斷,那么你去做你的事情,但是過一段時間來看看IO調用是否結束,這就是非阻塞:你可以做更多的事情,但是你得時不時的檢查中斷狀態,帶來的開銷也不小。
為了更高效,Nginx利用了LINUX的EPOLL模型(其他系統類似):
EPOLL模型,提供一種事件驅動機制,它可以監控多個事件是否準備好了,如果準備好了,那么就放入EPOLL隊列中。這種機制是異步的。通過這樣,WORKER進程只需要循環處理EPOLL隊列中的請求,我們只需要在請求間不斷切換,而這種切換是不需要付出什么代價的,通過這種循環處理已經準備好的請求,從而Nginx可以高效的處理高并發的問題。
總結
以上是生活随笔為你收集整理的【Nginx】Nginx 工作原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx工作原理和优化、漏洞
- 下一篇: Nginx —— 检查配置文件ngi