天天看點

Nginx——Nginx原理

Nginx——Nginx原理

nginx 在啟動後,會有一個 master 程序和多個 worker 程序。master 程序主要用來管理 worker 程序,包含:接收來自外界的信号,向各 worker 程序發送信号,監控 worker 程序的運作狀态,當 worker 程序退出後(異常情況下),會自動重新啟動新的 worker 程序。而基本的網絡事件,則是放在 worker 程序中來處理了。多個 worker 程序之間是對等的,他們同等競争來自用戶端的請求,各程序互相之間是獨立的。一個請求,隻可能在一個 worker 程序中處理,一個 worker 程序,不可能處理其它程序的請求。worker 程序的個數是可以設定的,一般我們會設定與機器cpu核數一緻,這裡面的原因與 nginx 的程序模型以及事件處理模型是分不開的。nginx 的程序模型,可以由下圖來表示:

Nginx——Nginx原理

對于每個 worker 程序來說,獨立的程序,不需要加鎖,是以省掉了鎖帶來的開銷,同時在程式設計以及問題查找時,也會友善很多。可以使用 nginx –s reload 熱部署,利用 nginx 進行熱部署操作。

采用獨立的程序,可以讓互相之間不會影響,一個程序退出後,其它程序還在工作,服務不會中斷,master 程序則很快啟動新的 worker 程序。當然,worker 程序的異常退出,肯定是程式有 bug 了,異常退出,會導緻目前 worker 上的所有請求失敗,不過不會影響到所有請求,是以降低了風險。每個 woker 是獨立的程序,如果有其中的一個 woker 出現問題,其他 woker 獨立的,繼續進行争搶,實作請求過程,不會造成服務中斷。

nginx 同 redis 類似都采用了 io 多路複用機制,每個 worker 都是一個獨立的程序,但每個程序裡隻有一個主線程,通過異步非阻塞的方式來處理請求, 即使是千上萬個請求也不在話下。每個 worker 的線程可以把一個 cpu 的性能發揮到極緻。是以 worker 數和伺服器的 cpu 數相等是最為适宜的。設少了會浪費 cpu,設多了會造成 cpu 頻繁切換上下文帶來的損耗。

繼續閱讀