深入理解Nginx:模塊開發(fā)與架構(gòu)解析(第2版)
定 價(jià):99 元
叢書名:Linux/Unix技術(shù)叢書
當(dāng)前圖書已被 1 所學(xué)校薦購過!
查看明細(xì)
- 作者:陶輝
- 出版時(shí)間:2016/2/19
- ISBN:9787111526254
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP
- 頁碼:624
- 紙張:
- 版次:2
- 開本:16K
本書包括四大部分:Nginx能幫我做什么;如何編寫一個(gè)定制的module;深入Nginx;實(shí)戰(zhàn)。部分針對(duì)初級(jí)讀者,介紹Nginx關(guān)于獲取編譯運(yùn)行的基本知識(shí)。第二部分針對(duì)中級(jí)讀者,以一個(gè)例子為主線,告訴讀者如何開發(fā)一個(gè)模塊,這部分讀者不需要深入了解Nginx的細(xì)節(jié),只需要知道如何實(shí)現(xiàn)一個(gè)基本的模塊。第三部分針對(duì)高級(jí)讀者,這是本書的重點(diǎn),徹底解析Nginx架構(gòu),深入探討Nginx各種設(shè)計(jì)的目的與意義,并對(duì)第二部分使用到的一些特性進(jìn)行代碼設(shè)計(jì)實(shí)現(xiàn)上的探索。讀者讀完本部分,會(huì)對(duì)整個(gè)Nginx架構(gòu)有清晰的認(rèn)識(shí),可以編寫各種模塊(不局限于模塊)插入到Nginx中,從而定制自己的Nginx。第四部分針對(duì)中高級(jí)讀者,以Tengine的開源模塊為例,幫助讀者從實(shí)戰(zhàn)角度理解第二、三部分描述的內(nèi)容。
Contents?目 錄
前 言
部分 Nginx能幫我們做什么
第1章 研究Nginx前的準(zhǔn)備工作 2
1.1 Nginx是什么 2
1.2 為什么選擇Nginx 5
1.3 準(zhǔn)備工作 7
1.3.1 Linux操作系統(tǒng) 7
1.3.2 使用Nginx的必備軟件 7
1.3.3 磁盤目錄 8
1.3.4 Linux內(nèi)核參數(shù)的優(yōu)化 9
1.3.5 獲取Nginx源碼 10
1.4 編譯安裝Nginx 11
1.5 conf?igure詳解 11
1.5.1 conf?igure的命令參數(shù) 11
1.5.2 conf?igure執(zhí)行流程 18
1.5.3 conf?igure生成的文件 21
1.6 Nginx的命令行控制 23
1.7 小結(jié) 27
第2章 Nginx的配置 28
2.1 運(yùn)行中的Nginx進(jìn)程間的關(guān)系 28
2.2 Nginx配置的通用語法 31
2.2.1 塊配置項(xiàng) 31
2.2.2 配置項(xiàng)的語法格式32
2.2.3 配置項(xiàng)的注釋 33
2.2.4 配置項(xiàng)的單位 33
2.2.5 在配置中使用變量33
2.3 Nginx服務(wù)的基本配置 34
2.3.1 用于調(diào)試進(jìn)程和定位問題的配置項(xiàng)34
2.3.2 正常運(yùn)行的配置項(xiàng)36
2.3.3 優(yōu)化性能的配置項(xiàng)37
2.3.4 事件類配置項(xiàng) 39
2.4 用核心模塊配置一個(gè)靜態(tài)Web服務(wù)器 40
2.4.1 虛擬主機(jī)與請(qǐng)求的分發(fā)41
2.4.2 文件路徑的定義 45
2.4.3 內(nèi)存及磁盤資源的分配47
2.4.4 網(wǎng)絡(luò)連接的設(shè)置 49
2.4.5 MIME類型的設(shè)置 52
2.4.6 對(duì)客戶端請(qǐng)求的限制53
2.4.7 文件操作的優(yōu)化 54
2.4.8 對(duì)客戶端請(qǐng)求的特殊處理56
2.4.9 ngx__core_module模塊提供的變量 57
2.5 用 proxy module配置一個(gè)反向代理服務(wù)器 59
2.5.1 負(fù)載均衡的基本配置61
2.5.2 反向代理的基本配置63
2.6 小結(jié) 66
第二部分 如何編寫模塊
第3章 開發(fā)一個(gè)簡單的模塊 68
3.1 如何調(diào)用模塊 68
3.2 準(zhǔn)備工作 70
3.2.1 整型的封裝 71
3.2.2 ngx_str_t數(shù)據(jù)結(jié)構(gòu) 71
3.2.3 ngx_list_t數(shù)據(jù)結(jié)構(gòu) 71
3.2.4 ngx_table_elt_t數(shù)據(jù)結(jié)構(gòu) 75
3.2.5 ngx_buf_t數(shù)據(jù)結(jié)構(gòu) 75
3.2.6 ngx_chain_t數(shù)據(jù)結(jié)構(gòu) 77
3.3 如何將自己的模塊編譯進(jìn)Nginx 77
3.3.1 conf?ig文件的寫法 77
3.3.2 利用conf?igure腳本將定制的模塊加入到Nginx中 78
3.3.3 直接修改Makef?ile文件 81
3.4 模塊的數(shù)據(jù)結(jié)構(gòu) 82
3.5 定義自己的模塊 86
3.6 處理用戶請(qǐng)求 89
3.6.1 處理方法的返回值89
3.6.2 獲取URI和參數(shù) 92
3.6.3 獲取頭部 94
3.6.4 獲取包體 97
3.7 發(fā)送響應(yīng) 99
3.7.1 發(fā)送頭部 99
3.7.2 將內(nèi)存中的字符串作為包體發(fā)送101
3.7.3 經(jīng)典的“Hello World”示例 102
3.8 將磁盤文件作為包體發(fā)送103
3.8.1 如何發(fā)送磁盤中的文件104
3.8.2 清理文件句柄 106
3.8.3 支持用戶多線程下載和斷點(diǎn)續(xù)傳107
3.9 用C 語言編寫模塊 108
3.9.1 編譯方式的修改 108
3.9.2 程序中的符號(hào)轉(zhuǎn)換109
3.10 小結(jié) 110
第4章 配置、error日志和請(qǐng)求上下文 111
4.1 配置項(xiàng)的使用場(chǎng)景 111
4.2 怎樣使用配置 113
4.2.1 分配用于保存配置參數(shù)的數(shù)據(jù)結(jié)構(gòu)113
4.2.2 設(shè)定配置項(xiàng)的解析方式115
4.2.3 使用14種預(yù)設(shè)方法解析配置項(xiàng) 121
4.2.4 自定義配置項(xiàng)處理方法131
4.2.5 合并配置項(xiàng) 133
4.3 配置模型 135
4.3.1 解析配置的流程 136
4.3.2 配置模型的內(nèi)存布局 139
4.3.3 如何合并配置項(xiàng)142
4.3.4 預(yù)設(shè)配置項(xiàng)處理方法的工作原理144
4.4 error日志的用法 145
4.5 請(qǐng)求的上下文 149
4.5.1 上下文與全異步Web服務(wù)器的關(guān)系 149
4.5.2 如何使用上下文 151
4.5.3 框架如何維護(hù)上下文結(jié)構(gòu) 152
4.6 小結(jié) 153
第5章 訪問第三方服務(wù) 154
5.1 upstream的使用方式 155
5.1.1 ngx__upstream_t結(jié)構(gòu)體 158
5.1.2 設(shè)置upstream的限制性參數(shù) 159
5.1.3 設(shè)置需要訪問的第三方服務(wù)器地址160
5.1.4 設(shè)置回調(diào)方法 161
5.1.5 如何啟動(dòng)upstream機(jī)制 161
5.2 回調(diào)方法的執(zhí)行場(chǎng)景162
5.2.1 create_request回調(diào)方法 162
5.2.2 reinit_request回調(diào)方法 164
5.2.3 f?inalize_request回調(diào)方法 165
5.2.4 process_header回調(diào)方法 165
5.2.5 rewrite_redirect回調(diào)方法 167
5.2.6 input_f?ilter_init與input_f?ilter回調(diào)方法 167
5.3 使用upstream的示例 168
5.3.1 upstream的各種配置參數(shù) 168
5.3.2 請(qǐng)求上下文 170
5.3.3 在create_request方法中構(gòu)造請(qǐng)求 170
5.3.4 在process_header方法中解析包頭 171
5.3.5 在f?inalize_request方法中釋放資源 175
5.3.6 在ngx__mytest_handler方法中啟動(dòng)upstream 175
5.4 subrequest的使用方式 177
5.4.1 配置子請(qǐng)求的處理方式177
5.4.2 實(shí)現(xiàn)子請(qǐng)求處理完畢時(shí)的回調(diào)方法178
5.4.3 處理父請(qǐng)求被重新激活后的回調(diào)方法179
5.4.4 啟動(dòng)subrequest子請(qǐng)求 179
5.5 subrequest執(zhí)行過程中的主要場(chǎng)景 180
5.5.1 如何啟動(dòng)subrequest180
5.5.2 如何轉(zhuǎn)發(fā)多個(gè)子請(qǐng)求的響應(yīng)包體182
5.5.3 子請(qǐng)求如何激活父請(qǐng)求185
5.6 subrequest使用的例子 187
5.6.1 配置文件中子請(qǐng)求的設(shè)置187
5.6.2 請(qǐng)求上下文 188
5.6.3 子請(qǐng)求結(jié)束時(shí)的處理方法188
5.6.4 父請(qǐng)求的回調(diào)方法189
5.6.5 啟動(dòng)subrequest190
5.7 小結(jié) 191
第6章 開發(fā)一個(gè)簡單的過濾模塊 192
6.1 過濾模塊的意義 192
6.2 過濾模塊的調(diào)用順序193
6.2.1 過濾鏈表是如何構(gòu)成的194
6.2.2 過濾鏈表的順序196
6.2.3 官方默認(rèn)過濾模塊的功能簡介 197
6.3 過濾模塊的開發(fā)步驟 198
6.4 過濾模塊的簡單例子 200
6.4.1 如何編寫conf?ig文件 201
6.4.2 配置項(xiàng)和上下文201
6.4.3 定義過濾模塊 203
6.4.4 初始化過濾模塊 204
6.4.5 處理請(qǐng)求中的頭部 204
6.4.6 處理請(qǐng)求中的包體 206
6.5 小結(jié) 206
第7章 Nginx提供的高級(jí)數(shù)據(jù)結(jié)構(gòu) 207
7.1 Nginx提供的高級(jí)數(shù)據(jù)結(jié)構(gòu)概述 207
7.2 ngx_queue_t雙向鏈表 209
7.2.1 為什么設(shè)計(jì)ngx_queue_t雙向鏈表 209
7.2.2 雙向鏈表的使用方法209
7.2.3 使用雙向鏈表排序的例子212
7.2.4 雙向鏈表是如何實(shí)現(xiàn)的213
7.3 ngx_array_t動(dòng)態(tài)數(shù)組 215
7.3.1 為什么設(shè)計(jì)ngx_array_t動(dòng)態(tài)數(shù)組 215
7.3.2 動(dòng)態(tài)數(shù)組的使用方法215
7.3.3 使用動(dòng)態(tài)數(shù)組的例子217
7.3.4 動(dòng)態(tài)數(shù)組的擴(kuò)容方式218
7.4 ngx_list_t單向鏈表 219
7.5 ngx_rbtree_t紅黑樹 219
7.5.1 為什么設(shè)計(jì)ngx_rbtree_t紅黑樹 219
7.5.2 紅黑樹的特性 220
7.5.3 紅黑樹的使用方法222
7.5.4 使用紅黑樹的簡單例子225
7.5.5 如何自定義添加成員方法226
7.6 ngx_radix_tree_t基數(shù)樹 228
7.6.1 ngx_radix_tree_t基數(shù)樹的原理 228
7.6.2 基數(shù)樹的使用方法230
7.6.3 使用基數(shù)樹的例子231
7.7 支持通配符的散列表232
7.7.1 ngx_hash_t基本散列表 232
7.7.2 支持通配符的散列表235
7.7.3 帶通配符散列表的使用例子241
7.8 小結(jié) 245
第三部分 深入Nginx
第8章 Nginx基礎(chǔ)架構(gòu) 248
8.1 Web服務(wù)器設(shè)計(jì)中的關(guān)鍵約束 249
8.2 Nginx的架構(gòu)設(shè)計(jì) 251
8.2.1 的模塊化設(shè)計(jì)251
8.2.2 事件驅(qū)動(dòng)架構(gòu) 254
8.2.3 請(qǐng)求的多階段異步處理256
8.2.4 管理進(jìn)程、多工作進(jìn)程設(shè)計(jì)259
8.2.5 平臺(tái)無關(guān)的代碼實(shí)現(xiàn)259
8.2.6 內(nèi)存池的設(shè)計(jì) 259
8.2.7 使用統(tǒng)一管道過濾器模式的過濾模塊 260
8.2.8 其他一些用戶模塊260
8.3 Nginx框架中的核心結(jié)構(gòu)體ngx_cycle_t 260
8.3.1 ngx_listening_t結(jié)構(gòu)體 261
8.3.2 ngx_cycle_t結(jié)構(gòu)體 262
8.3.3 ngx_cycle_t支持的方法 264
8.4 Nginx啟動(dòng)時(shí)框架的處理流程 266
8.5 worker進(jìn)程是如何工作的 269
8.6 master進(jìn)程是如何工作的 271
8.7 ngx_pool_t內(nèi)存池 276
8.8 小結(jié) 284
第9章 事件模塊 285
9.1 事件處理框架概述 286
9.2 Nginx事件的定義 288
9.3 Nginx連接的定義 291
9.3.1 被動(dòng)連接 292
9.3.2 主動(dòng)連接 295
9.3.3 ngx_connection_t連接池 296
9.4 ngx_events_module核心模塊 297
9.4.1 如何管理所有事件模塊的配置項(xiàng)299
9.4.2 管理事件模塊 300
9.5 ngx_event_core_module事件模塊 302
9.6 epoll事件驅(qū)動(dòng)模塊 308
9.6.1 epoll的原理和用法 308
9.6.2 如何使用epoll310
9.6.3 ngx_epoll_module模塊的實(shí)現(xiàn) 312
9.7 定時(shí)器事件 320
9.7.1 緩存時(shí)間的管理320
9.7.2 緩存時(shí)間的精度323
9.7.3 定時(shí)器的實(shí)現(xiàn) 323
9.8 事件驅(qū)動(dòng)框架的處理流程324
9.8.1 如何建立新連接325
9.8.2 如何解決“驚群”問題327
9.8.3 如何實(shí)現(xiàn)負(fù)載均衡329
9.8.4 post事件隊(duì)列 330
9.8.5 ngx_process_events_and_timers流程 331
9.9 文件的異步I/O 334
9.9.1 Linux內(nèi)核提供的文件異步I/O 335
9.9.2 ngx_epoll_module模塊中實(shí)現(xiàn)的針對(duì)文件的異步I/O 337
9.10 TCP協(xié)議與Nginx 342
9.11 小結(jié) 347
第10章 框架的初始化 348
10.1 框架概述 349
10.2 管理模塊的配置項(xiàng) 352
10.2.1 管理main級(jí)別下的配置項(xiàng) 353
10.2.2 管理server級(jí)別下的配置項(xiàng) 355
10.2.3 管理location級(jí)別下的配置項(xiàng) 358
10.2.4 不同級(jí)別配置項(xiàng)的合并364
10.3 監(jiān)聽端口的管理 367
10.4 server的快速檢索 370
10.5 location的快速檢索 370
10.6 請(qǐng)求的11個(gè)處理階段 372
10.6.1 處理階段的普適規(guī)則 374
10.6.2 NGX__POST_READ_PHASE階段 375
10.6.3 NGX__SERVER_REWRITE_PHASE階段 378
10.6.4 NGX__FIND_CONFIG_PHASE階段 378
10.6.5 NGX__REWRITE_PHASE階段 378
10.6.6 NGX__POST_REWRITE_PHASE階段 379
10.6.7 NGX__PREACCESS_PHASE階段 379
10.6.8 NGX__ACCESS_PHASE階段 379
10.6.9 NGX__POST_ACCESS_PHASE階段 380
10.6.10 NGX__TRY_FILES_PHASE階段 380
10.6.11 NGX__CONTENT_PHASE階段 380
10.6.12 NGX__LOG_PHASE階段 382
10.7 框架的初始化流程 382
10.8 小結(jié) 384
第11章 框架的執(zhí)行流程 385
11.1 框架執(zhí)行流程概述 386
11.2 新連接建立時(shí)的行為387
11.3 次可讀事件的處理388
11.4 接收請(qǐng)求行 394
11.5 接收頭部 398
11.6 處理請(qǐng)求 400
11.6.1 ngx__core_generic_phase 406
11.6.2 ngx__core_rewrite_phase 408
11.6.3 ngx__core_access_phase 409
11.6.4 ngx__core_content_phase 412
11.7 subrequest與post請(qǐng)求 415
11.8 處理包體 417
11.8.1 接收包體 419
11.8.2 放棄接收包體425
11.9 發(fā)送響應(yīng) 429
11.9.1 ngx__send_header 430
11.9.2 ngx__output_f?ilter 432
11.9.3 ngx__writer435
11.10 結(jié)束請(qǐng)求 437
11.10.1 ngx__close_connection 438
11.10.2 ngx__free_request 439
11.10.3 ngx__close_request 440
11.10.4 ngx__f?inalize_connection 441
11.10.5 ngx__terminate_request 443
11.10.6 ngx__f?inalize_request 443
11.11 小結(jié) 446
第12章 upstream機(jī)制的設(shè)計(jì)與實(shí)現(xiàn) 447
12.1 upstream機(jī)制概述 448
12.1.1 設(shè)計(jì)目的 448
12.1.2 ngx__upstream_t數(shù)據(jù)結(jié)構(gòu)的意義 450
12.1.3 ngx__upstream_conf_t配置結(jié)構(gòu)體 453
12.2 啟動(dòng)upstream455
12.3 與上游服務(wù)器建立連接457
12.4 發(fā)送請(qǐng)求到上游服務(wù)器460
12.5 接收上游服務(wù)器的響應(yīng)頭部463
12.5.1 應(yīng)用層協(xié)議的兩段劃分方式463
12.5.2 處理包體的3種方式 464
12.5.3 接收響應(yīng)頭部的流程465
12.6 不轉(zhuǎn)發(fā)響應(yīng)時(shí)的處理流程469
12.6.1 input_f?ilter方法的設(shè)計(jì) 469
12.6.2 默認(rèn)的input_f?ilter方法 470
12.6.3 接收包體的流程472
12.7 以下游網(wǎng)速優(yōu)先來轉(zhuǎn)發(fā)響應(yīng)473
12.7.1 轉(zhuǎn)發(fā)響應(yīng)的包頭474
12.7.2 轉(zhuǎn)發(fā)響應(yīng)的包體477
12.8 以上游網(wǎng)速優(yōu)先來轉(zhuǎn)發(fā)響應(yīng)481
12.8.1 ngx_event_pipe_t結(jié)構(gòu)體的意義 481
12.8.2 轉(zhuǎn)發(fā)響應(yīng)的包頭485
12.8.3 轉(zhuǎn)發(fā)響應(yīng)的包體487
12.8.4 ngx_event_pipe_read_upstream方法 489
12.8.5 ngx_event_pipe_write_to_downstream方法 494
12.9 結(jié)束upstream請(qǐng)求 496
12.10 小結(jié) 499
第13章 郵件代理模塊 500
13.1 郵件代理服務(wù)器的功能500
13.2 郵件模塊的處理框架503
13.2.1 一個(gè)請(qǐng)求的8個(gè)獨(dú)立處理階段 503
13.2.2 郵件類模塊的定義504
13.2.3 郵件框架的初始化506
13.3 初始化請(qǐng)求 506
13.3.1 描述郵件請(qǐng)求的ngx_mail_session_t結(jié)構(gòu)體 506
13.3.2 初始化郵件請(qǐng)求的流程509
13.4 接收并解析客戶端請(qǐng)求509
13.5 郵件認(rèn)證 510
13.5.1 ngx_mail_auth__ctx_t結(jié)構(gòu)體 510
13.5.2 與認(rèn)證服務(wù)器建立連接511
13.5.3 發(fā)送請(qǐng)求到認(rèn)證服務(wù)器513
13.5.4 接收并解析響應(yīng)514
13.6 與上游郵件服務(wù)器間的認(rèn)證交互514
13.6.1 ngx_mail_proxy_ctx_t結(jié)構(gòu)體 516
13.6.2 向上游郵件服務(wù)器發(fā)起連接516
13.6.3 與郵件服務(wù)器認(rèn)證交互的過程518
13.7 透?jìng)魃嫌梧]件服務(wù)器與客戶端間的流520
13.8 小結(jié) 524
第14章 進(jìn)程間的通信機(jī)制 525
14.1 概述 525
14.2 共享內(nèi)存 526
14.3 原子操作 530
14.3.1 不支持原子庫下的原子操作530
14.3.2 x86架構(gòu)下的原子操作 531
14.3.3 自旋鎖 533
14.4 Nginx頻道 535
14.5 信號(hào) 538
14.6 信號(hào)量 540
14.7 文件鎖 541
14.8 互斥鎖 544
14.8.1 文件鎖實(shí)現(xiàn)的ngx_shmtx_t鎖 546
14.8.2 原子變量實(shí)現(xiàn)的ngx_shmtx_t鎖 548
14.9 小結(jié) 553
第15章 變量 554
15.1 使用內(nèi)部變量開發(fā)模塊555
15.1.1 定義模塊 556
15.1.2 定義模塊加載方式 557
15.1.3 解析配置中的變量558
15.1.4 處理請(qǐng)求 560
15.2 內(nèi)部變量工作原理561
15.2.1 何時(shí)定義變量561
15.2.2 相關(guān)數(shù)據(jù)結(jié)構(gòu)詳述564
15.2.3 定義變量的方法572
15.2.4 使用變量的方法572
15.2.5 如何解析變量573
15.3 定義內(nèi)部變量 576
15.4 外部變量與腳本引擎577
15.4.1 相關(guān)數(shù)據(jù)結(jié)構(gòu)578
15.4.2 編譯“set”腳本 581
15.4.3 腳本執(zhí)行流程586
15.5 小結(jié) 589
第16章 slab共享內(nèi)存 590
16.1 操作slab共享內(nèi)存的方法 590
16.2 使用slab共享內(nèi)存池的例子 592
16.2.1 共享內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)593
16.2.2 操作共享內(nèi)存中的紅黑樹與鏈表595
16.2.3 解析配置文件600
16.2.4 定義模塊 603
16.3 slab內(nèi)存管理的實(shí)現(xiàn)原理 605
16.3.1 內(nèi)存結(jié)構(gòu)布局607
16.3.2 分配內(nèi)存流程613
16.3.3 釋放內(nèi)存流程617
16.3.4 如何使用位操作619
16.3.5 slab內(nèi)存池間的管理 624
16.4 小結(jié) 624