Nginx 原理和架構

albon_arith發表於2020-01-20

Nginx 是一個免費的,開源的,高效能的 HTTP 伺服器和反向代理,以及 IMAP / POP3 代理伺服器。Nginx 以其高效能,穩定性,豐富的功能,簡單的配置和低資源消耗而聞名。

Nginx 的整體架構

Nginx 整體架構

Nginx 裡有一個 master 程式和多個 worker 程式。master 程式並不處理網路請求,主要負責排程工作程式:載入配置、啟動工作程式及非停升級。worker 程式負責處理網路請求與響應。

master程式主要用來管理worker程式,具體包括如下4個主要功能:

  1. 接收來自外界的訊號。
  2. 向各worker程式傳送訊號。
  3. 監控woker程式的執行狀態。
  4. 當woker程式退出後(異常情況下),會自動重新啟動新的woker程式。

woker程式主要用來處理基本的網路事件:

  1. 多個worker程式之間是對等且相互獨立的,他們同等競爭來自客戶端的請求。
  2. 一個請求,只可能在一個worker程式中處理,一個worker程式,不可能處理其它程式的請求。
  3. worker程式的個數是可以設定的,一般我們會設定與機器cpu核數一致。同時,nginx為了更好的利用多核特性,具有cpu繫結選項,我們可以將某一個程式繫結在某一個核上,這樣就不會因為程式的切換帶來cache的失效。

Ngnix 是如何實現高效能的?

事件驅動模型

基於非同步及非阻塞的事件驅動模型,可以說是 Nginx 得以獲得高併發、高效能的關鍵因素。這一點上和 Netty 類似,底層都是使用的 BSD kqueue、Linux epoll 及 Solaris event ports。

多程式機制

使用多程式的好處有兩點:

  1. 程式之間不共享資源,不需要加鎖,減少了使用鎖對效能造成的影響,同時降低程式設計的複雜度,降低開發成本。
  2. 採用獨立的程式,可以讓程式互相之間不會影響,如果一個程式發生異常退出時,其它程式正常工作,master 程式則很快啟動新的 worker 程式,確保服務不會中斷,從而將風險降到最低。

記憶體池

為了避免出現記憶體碎片,減少向作業系統申請記憶體的次數、降低各個模組的開發複雜度,Nginx 設計了簡單的記憶體池,它的作用主要是把多次向系統申請記憶體的操作整合成一次,這大大減少了 CPU 資源的消耗,同時減少了記憶體碎片。

模組化設計

高度模組化的設計是 Nginx 的架構基礎。Openresty 就是在 Nginx 上引入了 lua 等第三方模組,使得擴充套件更加方便了。

Nginx 模組化設計

資料

  1. 淺談Nginx伺服器的內部核心架構設計
  2. nginx架構模型分析
  3. 深入 Nginx 之架構篇

推薦

  1. 系統設計:關於高可用系統的一些技術方案
  2. 基於系統負載的動態限流元件 dynamic-limiter

相關文章