## 輕量級
### 一. Nginx 模塊化設計
高度模塊化的設計是 Nginx 的架構基礎。Nginx 服務器被分解為多個模塊,每個模塊就是一個功能模塊,只負責自身的功能,模塊之間嚴格遵循“高內聚,低耦合”的原則。

**核心模塊**
核心模塊是 Nginx 服務器正常運行必不可少的模塊,提供錯誤日志記錄、配置文件解析、事件驅動機制、進程管理等核心功能。
**標準 HTTP 模塊**
標準 HTTP 模塊提供 HTTP 協議解析相關的功能,如:端口配置、網頁編碼設置、HTTP 響應頭設置等。
**可選 HTTP 模塊**
可選 HTTP 模塊主要用于擴展標準的 HTTP 功能,讓 Nginx 能處理一些特殊的服務,如:Flash 多媒體傳輸、解析 GeoIP 請求、SSL 支持等。
**郵件服務模塊**
郵件服務模塊主要用于支持 Nginx 的郵件服務,包括對 POP3 協議、IMAP 協議和 SMTP 協議的支持。
**第三方模塊**
第三方模塊是為了擴展 Nginx 服務器應用,完成開發者自定義功能,如:Json 支持、Lua 支持等。

### 二. Nginx 請求處理方式
Nginx 是一個高性能的 Web 服務器,能夠同時處理大量的并發請求。它結合多進程機制和異步機制,異步機制使用的是異步非阻塞方式,接下來就給大家介紹一下 Nginx 的多線程機制和異步非阻塞機制。
**多進程**
服務器每當收到一個客戶端時。就有服務器主進程(master process)生成一個子進程(worker process)出來和客戶端建立連接進行交互,直到連接斷開,該子進程就結束了。使用進程的好處是各個進程之間相互獨立,不需要加鎖,減少了使用鎖對性能造成影響,同時降低編程的復雜度,降低開發成本。其次,采用獨立的進程,可以讓進程互相之間不會影響,如果一個進程發生異常退出時,其它進程正常工作,master 進程則很快啟動新的 worker 進程,確保服務部中斷,將風險降到最低。缺點是操作系統生成一個子進程需要進行內存復制等操作,在資源和時間上會產生一定的開銷;當有大量請求時,會導致系統性能下降。
**異步非阻塞**
每個工作進程使用異步非阻塞方式,可以處理多個客戶端請求。當某個工作進程接收到客戶端的請求以后,調用 IO 進行處理,如果不能立即得到結果,就去處理其他的請求(即為非阻塞);而客戶端在此期間也無需等待響應,可以去處理其他事情(即為異步);當 IO 返回時,就會通知此工作進程;該進程得到通知,暫時掛起當前處理的事務去響應客戶端請求。
### 三. Nginx 事件驅動模型
在 Nginx 的異步非阻塞機制中,工作進程在調用 IO 后,就去處理其他的請求,當 IO 調用返回后,會通知該工作進程。對于這樣的系統調用,主要使用 Nginx 服務器的事件驅動模型來實現。

如上圖所示,Nginx 的事件驅動模型由事件收集器、事件發送器和事件處理器三部分基本單元組成。其中,事件收集器負責收集 worker 進程的各種 IO 請求,事件發送器負責將 IO 事件發送到事件處理器,而事件處理器負責各種事件的響應工作。
事件發送器將每個請求放入一個待處理事件的列表,使用非阻塞 I/O 方式調用“事件處理器”來處理該請求。其處理方式稱為“多路 IO 復用方法”,常見的包括以下三種:select 模型、poll 模型、epoll 模型。
### 四. Nginx 設計架構
Nginx 服務器使用 master/worker 多進程模式。多線程啟動和執行的流程如下:主程序 Master process 啟動后,通過一個 for 循環來接收和處理外部信號;主進程通過 fork() 函數產生子進程,每個子進程執行一個 for 循環來實現 Nginx 服務器對事件的接收和處理。
一般推薦 worker 進程數與 cpu 內核數一致,這樣一來不存在大量的子進程生成和管理任務,避免了進程之間競爭 CPU 資源和進程切換的開銷。而且 Nginx 為了更好的利用多核特性,提供了 cpu 親緣性的綁定選項,我們可以將某一個進程綁定在某一個核上,這樣就不會因為進程的切換帶來 cache 的失效。
對于每個請求,有且只有一個工作進程對其處理。首先,每個 worker 進程都是從 master 進程 fork 過來,在 master 進程里面,先建立好需要 listen 的 socket(listenfd)之后,然后再 fork 出多個 worker 進程。所有 worker 進程的 listenfd 會在新連接到來時變得可讀,為保證只有一個進程處理該連接,所有 worker 進程在注冊 listenfd 讀事件前搶 accept_mutex,搶到互斥鎖的那個進程注冊 listenfd 讀事件,在讀事件里調用 accept 接受該連接。當一個 worker 進程在 accept 這個連接之后,就開始讀取請求,解析請求,處理請求,產生數據后,再返回給客戶端,最后才斷開連接,這樣一個完整的請求就是這樣的了。我們可以看到,一個請求,完全由 worker 進程來處理,而且只在一個 worker 進程中處理。

在 Nginx 服務器的運行過程中,主進程和工作進程需要進程交互。交互依賴于 Socket 實現的管道來實現。
**Master-Worker 交互**
這條管道與普通的管道不同,它是由主進程指向工作進程的單向管道,包含主進程向工作進程發出的指令,工作進程 ID 等;同時主進程與外界通過信號通信;每個子進程具備接收信號,并處理相應的事件的能力。
**worker-worker 交互**
這種交互是和 Master-Worker 交互是基本一致的,但是會通過主進程。工作進程之間是相互隔離的,所以當工作進程 W1 需要向工作進程 W2 發指令時,首先找到 W2 的進程 ID,然后將正確的指令寫入指向 W2 的通道。W2 收到信號采取相應的措施。
### 五. 總結
通過這篇文章,我們對 Nginx 服務器的整體架構有了一個整體的認識。包括其模塊化的設計、
多進程和異步非阻塞的請求處理方式、事件驅動模型等。通過這些理論知識,對于我們以后學習 Nginx 的源碼有很大的幫助;也推薦大家多看看 Nginx 的源碼,才能更好地領悟 Nginx 的設計思想。
- 序言
- Nginx從入門到實踐
- 第一章 前言
- 第二章 基礎篇
- 2-1 什么是Nginx?
- 2-2 常見的中間件服務
- 2-3 Nginx特性-多路復用
- 2-4 Nginx特性-輕量級
- 2-5 Nginx特性-Cpu親和
- 2-6 Nginx特性_實現優點4
- 2-7 Nginx的快速安裝
- 2-8 Nginx安裝目錄
- 2-9 Nginx編譯配置參數
- 2-10 Nginx默認配置語法
- 2-11 Nginx默認站點啟動
- 2-12 HTTP請求
- 2-13 Nginx日志
- 2-14 Nginx模塊介紹
- 2-15 Nginx的請求限制
- 2-16 Nginx的訪問控制
- 第三章 場景實踐篇
- 3-1 Nginx作為靜態資源web服務
- 1、靜態資源類型
- 2、CDN場景
- 3、配置語法
- 4、場景演示
- 5、瀏覽器緩存原理
- 6、跨站訪問
- 7、防盜鏈
- 3-2 Nginx作為代理服務
- 1、代理服務.
- 2、反向代理配置場景
- 3、正向代理配置場景
- 4、代理配置和規范
- 3-3 Nginx作為負載均衡服務
- 1、配置語法與場景
- 2、參數講解
- 3、backup狀態演示
- 4、輪詢策略
- 3-4 Nginx作為緩存服務
- 1、緩存服務配置語法
- 2、場景配置演示.
- 3、分片請求
- 第四章 深度學習篇
- 4-1 Nginx動靜分離
- 4-2 Rewrite規則
- 1、配置語法
- 2、正則表達式
- 3、規則中的flag
- 4、redirect和permanent區別
- 5、規則場景
- 4-3 Nginx進階高級模塊
- 1、secure_link模塊作用原理
- 2、Geoip讀取地域信息模塊
- 4-4 基于Nginx的HTTPS服務
- 1、原理和作用
- 2、證書簽名生成CA證書.
- 3、實戰場景配置蘋果要求的openssl
- 4、HTTPS服務優化
- 4-5 Nginx與Lua的開發
- 1、Nginx與Lua特性與優勢
- 2、Lua基礎開發語法
- 3、Lua的指令及api接口
- 4、實戰場景灰度發布
- 第五章 Nginx架構篇
- 安全
- 5-27 Nginx+LUA防火墻功能
- Nginx 錯誤專題
- 1、 Failed to parse PID from file
- 2、error: the HTTP gzip module requires the zlib library
- 3、open() “/usr/local/nginx/html/favicon.ico” failed (2: No such file or directory)
- Openresty
- 控制命令