Nginx架構和原理

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