本書詳解了Nginx架構(gòu)、執(zhí)行流程、模塊實現(xiàn)與數(shù)據(jù)結(jié)構(gòu),剖析了Nginx源碼設(shè)計精髓與應(yīng)用。
第1~2章介紹Nginx編譯安裝、基礎(chǔ)架構(gòu)與設(shè)計理念,涵蓋源碼結(jié)構(gòu)、J程模型等,讓讀者對Nginx有整體性了解。
第3章從內(nèi)存池、共享內(nèi)存展開介紹Nginx的內(nèi)存管理與使用。
第4章分析Nginx的數(shù)據(jù)結(jié)構(gòu),即字符串、數(shù)組、鏈表、隊列、散列、紅黑樹、基數(shù)樹的數(shù)據(jù)結(jié)構(gòu)和算法。
第5章詳細(xì)介紹main配置塊、events配置塊與http配置塊,呈現(xiàn)Nginx配置解析的全過程。
第6章完整地介紹了Nginx的 J程管理,涵蓋 J程模式、master J程、worker J程以及 J程間通信機(jī)制。
第7章詳細(xì)分析HTTP模塊及其處理的11個階段,如模塊初始化流程、請求解析、請求響應(yīng)等。
第8章介紹了Upstream機(jī)制,涵蓋初始化、上下游連接建立、長連接等,著重介紹了FastCGI通信流程。
第9章詳細(xì)介紹Event模塊的實現(xiàn)以及Nginx中的驚群處理。
第10章介紹Nginx的負(fù)載均衡、限流、日志等模塊實現(xiàn)。
第11章介紹跨平臺實現(xiàn),涵蓋編譯過程、共享內(nèi)存等。
第12章介紹Nginx的RTMP直播服務(wù)實現(xiàn),著重介紹RTMP包協(xié)議與中繼模塊實現(xiàn)。
適讀人群 :Web開發(fā)工程師、架構(gòu)師、網(wǎng)絡(luò)工程師、架構(gòu)師 (1)理解源碼:涵蓋內(nèi)存、配置、進(jìn)程、網(wǎng)絡(luò)、事件、負(fù)載、日志等模塊。
(2)直播模塊開發(fā):Nginx的RTMP直播服務(wù)實現(xiàn),經(jīng)過百萬在線驗證實踐。
(3) 跨平臺實現(xiàn):涵蓋編譯過程、共享內(nèi)存等。
(4)直擊本質(zhì):多角度分析Nginx底層原理和設(shè)計,揭示Nginx高并發(fā)高性能本質(zhì)。
【本書特色】
內(nèi)容豐富:除了Nginx相關(guān)的進(jìn)程、數(shù)據(jù)結(jié)構(gòu)、配置、HTTP模塊、內(nèi)存等內(nèi)容,還附帶編譯腳手架和RTMP模塊的詳細(xì)講解。通過學(xué)習(xí)這些內(nèi)容,讀者可以了解模塊的構(gòu)成,開發(fā)定制模塊。
深入淺出:Nginx源碼設(shè)計中涉及很多知識,這對入門讀者來說有一定的難度。所以本書結(jié)合案例分析,讓讀者更輕松地理解這些龐雜、有難度的知識。
實戰(zhàn)講解:通過關(guān)鍵代碼片段以及原理分析進(jìn)行實戰(zhàn)難點(diǎn)講解。某些代碼分析還帶有源碼調(diào)試分析與處理流程圖,便于讀者動手實戰(zhàn),快速入門。
【本書結(jié)構(gòu)】
本書共12章,主要內(nèi)容介紹如下。
第1章介紹Nginx源碼與編譯安裝,第2章介紹Nginx基礎(chǔ)架構(gòu)與設(shè)計理念,這兩章從Nginx的優(yōu)勢、源碼結(jié)構(gòu)、進(jìn)程模型等幾個方面概述Nginx。
第3章介紹Nginx的內(nèi)存管理,從內(nèi)存池、共享內(nèi)存兩方面介紹Nginx內(nèi)存管理的相關(guān)內(nèi)容。
第4章介紹Nginx的基本數(shù)據(jù)結(jié)構(gòu),包括字符串、數(shù)組、鏈表、隊列、散列、紅黑樹、基數(shù)樹的數(shù)據(jù)結(jié)構(gòu)和算法。
第5章解析Nginx的配置文件,通過對main配置塊、events配置塊與http配置塊的詳細(xì)介紹,概述Nginx配置解析的全過程。
第6章介紹Nginx進(jìn)程機(jī)制,通過進(jìn)程模式、Master進(jìn)程、Worker進(jìn)程以及進(jìn)程間通信機(jī)制,完整介紹Nginx進(jìn)程的管理。
第7章介紹HTTP模塊,通過服務(wù)初始化、請求解析、HTTP請求處理以及HTTP請求響應(yīng),詳細(xì)介紹HTTP模塊的處理過程。
第8章介紹Upstream機(jī)制,對Upstream初始化、上下游連接建立、長連接、FastCGI模塊做了詳細(xì)介紹。
第9章介紹Event模塊實現(xiàn),內(nèi)容涉及Nginx事件模型的文件事件、時間事件、進(jìn)程池、連接池等事件處理流程。
第10章介紹Nginx的負(fù)載均衡、限流、日志等模塊的實現(xiàn)。
第11章介紹跨平臺實現(xiàn),對Nginx的configure編譯文件、跨平臺原子操作和鎖進(jìn)行詳細(xì)介紹。
第12章介紹基于Nginx的RTMP直播服務(wù)實現(xiàn)。
【預(yù)備知識】
讀者在學(xué)習(xí)本書之前可以對以下知識進(jìn)行初步了解,以便更好地學(xué)習(xí)與理解本書。
C/C++基礎(chǔ):首先要掌握C/C++語言基礎(chǔ),這樣有助于理解源碼語意、語法以及相關(guān)的業(yè)務(wù)邏輯。
GDB調(diào)試:本書中的一些代碼片段是采用GDB進(jìn)行調(diào)試的,因此了解GDB調(diào)試工具有助于對Nginx的進(jìn)程進(jìn)行調(diào)試。
Nginx基礎(chǔ)使用:本書基于Nginx 1.160版本編寫,如果你對Nginx的一些使用已經(jīng)了解,學(xué)習(xí)起來會更容易。
HTTP及其網(wǎng)絡(luò)編程基礎(chǔ)知識。
★聶松松
好未來學(xué)而思網(wǎng)校學(xué)習(xí)研發(fā)直播系統(tǒng)后端負(fù)責(zé)人,負(fù)責(zé)網(wǎng)校核心直播系統(tǒng)開發(fā)和架構(gòu)工作,擁有多年音視頻及流媒體相關(guān)工作經(jīng)驗,精通Nginx、ffmpeg相關(guān)技術(shù)棧。
★趙禹
好未來后端資深開發(fā)工程師,曾參與自主創(chuàng)業(yè)。目前負(fù)責(zé)云容器平臺Kubernetes組件開發(fā),熟悉PHP、Nginx、Redis、MySQL等源碼實現(xiàn),樂于鉆研技術(shù)。
★施洪寶
好未來后端開發(fā)專家,對Redis、Nginx、MySQL等開源軟件有較深的理解,熟悉C/C++、Go語言開發(fā),樂于鉆研技術(shù),合著有《Redis 5設(shè)計與源碼分析》。
★景羅
高級技術(shù)專家,曾在搜狐、新浪工作,擁有7年后端架構(gòu)開發(fā)經(jīng)驗,熟悉PHP、Nginx、Redis、MySQL等源碼實現(xiàn),擅長高并發(fā)處理及大型網(wǎng)站架構(gòu)開發(fā)。
★黃桃
高級技術(shù)專家,曾在滴滴等公司工作,擁有8年后端架構(gòu)開發(fā)經(jīng)驗,著有《PHP 7底層設(shè)計與源碼實現(xiàn)》等書籍。
★李樂
好未來學(xué)而思網(wǎng)校PHP開發(fā)專家,樂于鉆研技術(shù)與源碼研究,對Redis和Nginx有較深的理解,合著有《Redis 5設(shè)計與源碼分析》。
★張報
好未來集團(tuán)接入層網(wǎng)關(guān)方向負(fù)責(zé)人,對Nginx、Tengine、OpenResty等高性能Web服務(wù)器有深入理解,精通大型站點(diǎn)架構(gòu)與流量調(diào)度系統(tǒng)的設(shè)計與實現(xiàn)。
★閆昌
好未來后端開發(fā)專家,深耕信息安全領(lǐng)域多年,對Linux服務(wù)端開發(fā)有較深見解,擅長高并發(fā)業(yè)務(wù)的實現(xiàn)。
★田峰
學(xué)而思學(xué)服研發(fā)部負(fù)責(zé)人,從業(yè)10余年,曾在搜狗、百度、360等公司從事研發(fā)和技術(shù)管理工作,在高性能服務(wù)架構(gòu)設(shè)計及復(fù)雜業(yè)務(wù)系統(tǒng)開發(fā)方面擁有豐富的經(jīng)驗。
前 言
第1章 Nginx源碼與編譯安裝 1
1.1 Nginx優(yōu)勢與4種應(yīng)用示例 1
1.2 Nginx源碼結(jié)構(gòu) 4
1.3 Nginx編譯安裝 5
1.4 本章小結(jié) 6
第2章 Nginx基礎(chǔ)架構(gòu)與設(shè)計理念 7
2.1 Nginx進(jìn)程模型 7
2.2 Nginx模塊化設(shè)計 9
2.2.1 模塊分類 9
2.2.2 模塊接口 10
2.2.3 模塊分工 12
2.3 Nginx事件驅(qū)動 13
2.4 本章小結(jié) 14
第3章 Nginx內(nèi)存管理 15
3.1 Nginx內(nèi)存管理簡介 15
3.2 Nginx內(nèi)存池 16
3.2.1 內(nèi)存池結(jié)構(gòu) 16
3.2.2 申請內(nèi)存 17
3.2.3 釋放內(nèi)存 20
3.3 Nginx共享內(nèi)存 22
3.3.1 共享內(nèi)存的創(chuàng)建及銷毀 22
3.3.2 互斥鎖 23
3.3.3 共享內(nèi)存管理 25
3.3.4 共享內(nèi)存使用 30
3.4 本章小結(jié) 31
第4章 基本數(shù)據(jù)結(jié)構(gòu) 32
4.1 字符串 32
4.2 數(shù)組 33
4.3 鏈表 35
4.4 隊列 37
4.5 散列 42
4.6 紅黑樹 46
4.7 基數(shù)樹 56
4.8 本章小結(jié) 59
第5章 配置文件解析 60
5.1 配置文件簡介 60
5.2 主函數(shù)ngx_conf_parse 63
5.3 解析main配置 65
5.3.1 創(chuàng)建main配置上下文 65
5.3.2 解析配置指令 66
5.4 解析events配置塊 69
5.5 解析http配置塊 71
5.5.1 main配置解析 71
5.5.2 server配置解析 74
5.5.3 location配置解析 76
5.5.4 配置合并 79
5.5.5 location配置再處理 81
5.5.6 upstream配置解析 83
5.6 本章小結(jié) 85
第6章 Nginx進(jìn)程機(jī)制 86
6.1 Nginx進(jìn)程模式 86
6.1.1 daemon模式 86
6.1.2 單進(jìn)程模式和多進(jìn)程模式 88
6.1.3 進(jìn)程模式源碼解析 88
6.2 Master進(jìn)程 91
6.3 Worker進(jìn)程 93
6.4 進(jìn)程間通信機(jī)制 99
6.4.1 信號定義 99
6.4.2 信號注冊 101
6.4.3 信號處理 102
6.4.4 Master進(jìn)程處理機(jī)制 106
6.4.5 Worker進(jìn)程處理機(jī)制 110
6.4.6 Master進(jìn)程與Worker進(jìn)程通信 111
6.5 本章小結(jié) 115
第7章 HTTP模塊 116
7.1 整體流程 117
7.1.1 HTTP模塊初始化 117
7.1.2 HTTP請求解析 118
7.1.3 HTTP請求處理與響應(yīng) 120
7.2 HTTP服務(wù)初始化 123
7.2.1 模塊初始化 123
7.2.2 事件初始化 126
7.2.3 HTTP會話建立 128
7.3 HTTP請求解析 130
7.3.1 基礎(chǔ)結(jié)構(gòu)體 131
7.3.2 接收請求流程 135
7.3.3 解析請求行 137
7.3.4 解析請求頭 143
7.4 HTTP請求處理 148
7.4.1 多階段劃分 148
7.4.2 11個階段初始化 153
7.4.3 處理HTTP請求 155
7.4.4 處理請求體 169
7.5 HTTP請求響應(yīng) 177
7.5.1 過濾模塊 177
7.5.2 發(fā)送HTTP響應(yīng) 182
7.5.3 結(jié)束HTTP響應(yīng) 190
7.6 本章小結(jié) 197
第8章 Upstream機(jī)制 198
8.1 Upstream簡介 198
8.2 初始化Upstream 200
8.3 與上游建立連接 205
8.4 發(fā)送請求到上游 208
8.5 處理上游響應(yīng)頭 210
8.6 處理上游響應(yīng)體 213
8.7 結(jié)束請求 217
8.8 重試機(jī)制 219
8.9 長連接 220
8.10 FastCGI模塊 225
8.10.1 FastCGI協(xié)議簡介 225
8.10.2 FastCGI通信流程 226
8.10.3 Nginx FastCGI 227
8.11 本章小結(jié) 228
第9章 Event模塊實現(xiàn) 229
9.1 基礎(chǔ)知識及相關(guān)配置項介紹 230
9.1.1 基本概念 230
9.1.2 基本網(wǎng)絡(luò)模型 230
9.1.3 epoll網(wǎng)絡(luò)模型 231
9.1.4 Event模塊相關(guān)配置項介紹 234
9.2 Nginx事件模型 234
9.2.1 文件事件 235
9.2.2 時間事件 235
9.2.3 進(jìn)程池 237
9.2.4 監(jiān)聽池 237
9.2.5 連接池 238
9.2.6 事件池 240
9.2.7 Event模塊初始化過程 244
9.2.8 請求處理流程 257
9.3 Nginx的驚群處理 262
9.4 Nginx的陳舊事件處理 264
9.5 本章小結(jié) 266
第10章 其他模塊 267
10.1 負(fù)載均衡模塊 267
10.1.1 Nginx負(fù)載均衡算法簡介 267
10.1.2 Nginx負(fù)載均衡配置指令 268
10.1.3 Nginx負(fù)載均衡算法實現(xiàn) 270
10.2 限流模塊 276
10.2.1 常見限流算法 276
10.2.2 Nginx限流配置 277
10.2.3 限流實現(xiàn)原理 278
10.3 日志模塊 287
10.3.1 日志模塊配置指令 288
10.3.2 日志模塊實現(xiàn)原理 290
10.4 本章小結(jié) 295
第11章 跨平臺實現(xiàn) 296
11.1 configure實現(xiàn)詳解 296
11.2 跨平臺的原子操作和鎖 304
11.3 信號量 311
11.4 信號和進(jìn)程管理 315
11.5 共享內(nèi)存 322
11.6 本章小結(jié) 325
第12章 基于Nginx的RTMP直播服務(wù)實現(xiàn) 326
12.1 Nginx-RTMP簡介 326
12.2 握手 328
12.3 分塊 331
12.4 Nginx-RTMP模塊 335
12.5 中繼模塊 342
12.6 本章小結(jié) 347