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