Nginx——Nginx原理

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

master-workers 的機制的好處

  • 對於每個 worker 進程來說,獨立的進程,不需要加鎖,所以省掉了鎖帶來的開銷,同時在編程以及問題查找時,也會方便很多。可以使用 nginx –s reload 熱部署,利用 nginx 進行熱部署操作。
  • 採用獨立的進程,可以讓互相之間不會影響,一個進程退出後,其它進程還在工作,服務不會中斷,master 進程則很快啓動新的 worker 進程。當然,worker 進程的異常退出,肯定是程序有 bug 了,異常退出,會導致當前 worker 上的所有請求失敗,不過不會影響到所有請求,所以降低了風險。每個 woker 是獨立的進程,如果有其中的一個 woker 出現問題,其他 woker 獨立的,繼續進行爭搶,實現請求過程,不會造成服務中斷。

需要設置多少個 worker

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章