Nginx深入詳解之多程序網路模型
阿新 • • 發佈:2018-11-23
一、程序模型
Nginx之所以為廣大碼農喜愛,除了其高效能外,還有其優雅的系統架構。與Memcached的經典多執行緒模型相比,Nginx是經典的多程序模型。Nginx啟動後以daemon的方式在後臺執行,後臺程序包含一個master程序和多個worker程序,具體如下圖:
圖1 Nginx多程序模型
master程序主要用來管理worker程序,具體包括如下4個主要功能:
(1)接收來自外界的訊號。
(2)向各worker程序傳送訊號。
(3)監控woker程序的執行狀態。
(4)當woker程序退出後(異常情況下),會自動重新啟動新的woker程序。
woker程序主要用來處理網路事件,各個woker程序之間是對等且相互獨立的,它們同等競爭來自客戶端的請求,一個請求只可能在一個woker程序中處理,woker程序個數一般設定為機器CPU核數。
二、
對Nginx程序的控制主要是通過master程序來做到的,主要有兩種方式:
(1)手動傳送訊號
從圖1可以看出,master接收訊號以管理眾woker程序,那麼,可以通過kill向master程序傳送訊號,比如kill -HUP pid用以通知Nginx從容重啟。所謂從容重啟就是不中斷服務:master程序在接收到訊號後,會先重新載入配置,然後再啟動新程序開始接收新請求,並向所有老程序傳送訊號告知不再接收新請求並在處理完所有未處理完的請求後自動退出。
(2)自動傳送訊號
可以通過帶命令列引數啟動新程序來發送訊號給master程序,比如./nginx -s reload用以啟動一個新的Nginx程序,而新程序在解析到reload引數後會向master程序傳送訊號(新程序會幫我們把手動傳送訊號中的動作自動完成)。當然也可以這樣./nginx -s stop來停止Nginx。
三、網路事件
Nginx採用非同步非阻塞的方式來處理網路事件,類似於Libevent,具體過程如下圖:
圖2 Nginx網路事件
master程序先建好需要listen的socket後,然後再fork出多個woker程序,這樣每個work程序都可以去accept這個socket。當一個client連線到來時,所有accept的work程序都會受到通知,但只有一個程序可以accept成功,其它的則會accept失敗。Nginx提供了一把共享鎖accept_mutex來保證同一時刻只有一個work程序在accept連線,從而解決驚群問題。當一個worker程序accept這個連線後,就開始讀取請求,解析請求,處理請求,產生資料後,再返回給客戶端,最後才斷開連線,這樣一個完成的請求就結束了。