深入理解Nginx

深入理解Nginx

《深入理解Nginx》是2013年機械工業出版社出版的圖書,作者是陶輝。本書通過還原Nginx設計思想,剖析Nginx架構來幫助讀者快速高效開發HTTP模組。

內容簡介

本書是阿里巴巴資深Nginx技術專家嘔心瀝血之作,是作者多年的經驗結晶。

本書首先通過介紹官方Nginx的基本用法和配置規則,幫助讀者了解一般Nginx模組的用法,然後重點介紹如何開發HTTP模組(含HTTP過濾模組)來得到定製的Nginx,其中包括開發一個功能複雜的模組所需要了解的各種知識,如Nginx的基礎數據結構、配置項的解析、記錄日誌的工具以及upstream、subrequest的使用方法等。在此基礎上,綜合Nginx框架代碼分析Nginx的架構,介紹其設計理念和技巧,進一步幫助讀者自由、有效地開發出功能豐富、性能一流的Nginx模組。

作者簡介

陶輝,畢業於西安交通大學計算機科學與技術專業,曾就職於華為中央軟體部、騰訊QQ空間、思科中國CRDC等公司,目前在阿里巴巴雲計算公司的飛天團隊工作,研究方向為介於IaaS和PaaS間的彈性計算,多年以來專注於Nginx的定製化套用,對Nginx的設計與特性有深刻認識,實戰經驗豐富,編寫過許多優秀的Nginx模組並套用於企業級產品中,同時撰寫了大量關於Nginx的技術文章。擅長Linux環境下高性能伺服器的開發,以及分散式環境下海量數據存儲的設計開發。

圖書目錄

前 言
第一部分 Nginx能幫我們做什麼
第1章 研究Nginx前的準備工作 / 2
1.1 Nginx是什麼 / 2
1.2 為什麼選擇Nginx / 4
1.3 準備工作 / 7
1.3.1 Linux作業系統 / 7
1.3.2 使用Nginx的必備軟體 / 7
1.3.3 磁碟目錄 / 8
1.3.4 Linux核心參數的最佳化 / 9
1.3.5 獲取Nginx源碼 / 11
1.4 編譯安裝Nginx / 11
1.5 configure詳解 / 11
1.5.1 configure的命令參數 / 12
1.5.2 configure執行流程 / 18
1.5.3 configure生成的檔案 / 22
1.6 Nginx的命令行控制 / 24
1.7 小結 / 27
第2章 Nginx的配置 / 28
2.1 運行中的Nginx進程間的關係 / 28
2.2 Nginx配置的通用語法 / 31
2.2.1 塊配置項 / 31
2.2.2 配置項的語法格式 / 32
2.2.3 配置項的注釋 / 33
2.2.4 配置項的單位 / 33
2.2.5 在配置中使用變數 / 33
2.3 Nginx服務的基本配置 / 34
2.3.1 用於調試進程和定位問題的配置項 / 34
2.3.2 正常運行的配置項 / 36
2.3.3 最佳化性能的配置項 / 38
2.3.4 事件類配置項 / 39
2.4 用HTTP核心模組配置一個靜態Web伺服器 / 41
2.4.1 虛擬主機與請求的分發 / 42
2.4.2 檔案路徑的定義 / 45
2.4.3 記憶體及磁碟資源的分配 / 48
2.4.4 網路連線的設定 / 50
2.4.5 MIME類型的設定 / 53
2.4.6 對客戶端請求的限制 / 54
2.4.7 檔案操作的最佳化 / 55
2.4.8 對客戶端請求的特殊處理 / 57
2.4.9 ngx_http_core_module模組提供的變數 / 59
2.5 用HTTP proxy module配置一個反向代理伺服器 / 60
2.5.1 負載均衡的基本配置 / 62
2.5.2 反向代理的基本配置 / 64
2.6 小結 / 68
第二部分 如何編寫HTTP模組
第3章 開發一個簡單的HTTP模組 / 70
3.1 如何調用HTTP模組 / 70
3.2 準備工作 / 72
3.2.1 整型的封裝 / 72
3.2.2 ngx_str_t數據結構 / 73
3.2.3 ngx_list_t數據結構 / 73
3.2.4 ngx_table_elt_t數據結構 / 77
3.2.5 ngx_buf_t數據結構 / 77
3.2.6 ngx_chain_t數據結構 / 79
3.3 如何將自己的HTTP模組編譯進Nginx / 79
3.3.1 config檔案的寫法 / 80
3.3.2 利用configure腳本將定製的模組加入到Nginx中 / 80
3.3.3 直接修改Makefile檔案 / 84
3.4 HTTP模組的數據結構 / 85
3.5 定義自己的HTTP模組 / 88
3.6 處理用戶請求 / 92
3.6.1 處理方法的返回值 / 92
3.6.2 獲取URI和參數 / 95
3.6.3 獲取HTTP頭部 / 98
3.6.4 獲取HTTP包體 / 101
3.7 傳送回響 / 102
3.7.1 傳送HTTP頭部 / 102
3.7.2 將記憶體中的字元串作為包體傳送 / 104
3.7.3 經典的“Hello World”示例 / 106
3.8 將磁碟檔案作為包體傳送 / 107
3.8.1 如何傳送磁碟中的檔案 / 107
3.8.2 清理檔案句柄 / 110
3.8.3 支持用戶多執行緒下載和斷點續傳 / 111
3.9 用C++語言編寫HTTP模組 / 112
3.9.1 編譯方式的修改 / 112
3.9.2 程式中的符號轉換 / 114
3.10 小結 / 114
第4章 配置、error日誌和請求上下文 / 115
4.1 http配置項的使用場景 / 115
4.2 怎樣使用http配置 / 117
4.2.1 分配用於保存配置參數的數據結構 / 117
4.2.2 設定配置項的解析方式 / 119
4.2.3 使用14種預設方法解析配置項 / 125
4.2.4 自定義配置項處理方法 / 136
4.2.5 合併配置項 / 137
4.3 HTTP配置模型 / 140
4.3.1 解析HTTP配置的流程 / 141
4.3.2 HTTP配置模型的記憶體布局 / 144
4.3.3 如何合併配置項 / 147
4.3.4 預設配置項處理方法的工作原理 / 149
4.4 error日誌的用法 / 150
4.5 請求的上下文 / 155
4.5.1 上下文與全異步Web伺服器的關係 / 155
4.5.2 如何使用HTTP上下文 / 156
4.5.3 HTTP框架如何維護上下文結構 / 157
4.6 小結 / 158
第5章 訪問第三方服務 / 159
5.1 upstream的使用方式 / 160
5.1.1 ngx_http_upstream_t結構體 / 163
5.1.2 設定upstream的限制性參數 / 164
5.1.3 設定需要訪問的第三方伺服器地址 / 165
5.1.4 設定回調方法 / 166
5.1.5 如何啟動upstream機制 / 166
5.2 回調方法的執行場景 / 167
5.2.1 create_request回調方法 / 167
5.2.2 reinit_request回調方法 / 169
5.2.3 finalize_request回調方法 / 170
5.2.4 process_header回調方法 / 171
5.2.5 rewrite_redirect回調方法 / 172
5.2.6 input_filter_init與input_filter回調方法 / 172
5.3 使用upstream的示例 / 173
5.3.1 upstream的各種配置參數 / 174
5.3.2 請求上下文 / 175
5.3.3 在create_request方法中構造請求 / 176
5.3.4 在process_header方法中解析包頭 / 177
5.3.5 在finalize_request方法中釋放資源 / 180
5.3.6 在ngx_http_mytest_handler方法中啟動upstream / 181
5.4 subrequest的使用方式 / 183
5.4.1 配置子請求的處理方式 / 183
5.4.2 實現子請求處理完畢時的回調方法 / 184
5.4.3 處理父請求被重新激活後的回調方法 / 185
5.4.4 啟動subrequest子請求 / 185
5.5 subrequest執行過程中的主要場景 / 186
5.5.1 如何啟動subrequest / 186
5.5.2 如何轉發多個子請求的回響包體 / 188
5.5.3 子請求如何激活父請求 / 192
5.6 subrequest使用的例子 / 193
5.6.1 配置檔案中子請求的設定 / 194
5.6.2 請求上下文 / 194
5.6.3 子請求結束時的處理方法 / 195
5.6.4 父請求的回調方法 / 196
5.6.5 啟動subrequest / 197
5.7 小結 / 198
第6章 開發一個簡單的HTTP過濾模組 / 199
6.1 過濾模組的意義 / 199
6.2 過濾模組的調用順序 / 200
6.2.1 過濾鍊表是如何構成的 / 200
6.2.2 過濾鍊表的順序 / 203
6.2.3 官方默認HTTP過濾模組的功能簡介 / 204
6.3 HTTP過濾模組的開發步驟 / 206
6.4 HTTP過濾模組的簡單例子 / 207
6.4.1 如何編寫config檔案 / 208
6.4.2 配置項和上下文 / 208
6.4.3 定義HTTP過濾模組 / 210
6.4.4 初始化HTTP過濾模組 / 211
6.4.5 處理請求中的HTTP頭部 / 212
6.4.6 處理請求中的HTTP包體 / 213
6.5 小結 / 214
第7章 Nginx提供的高級數據結構 / 215
7.1 Nginx提供的高級數據結構概述 / 215
7.2 ngx_queue_t雙向鍊表 / 217
7.2.1 為什麼設計ngx_queue_t雙向鍊表 / 217
7.2.2 雙向鍊表的使用方法 / 217
7.2.3 使用雙向鍊表排序的例子 / 219
7.2.4 雙向鍊表是如何實現的 / 221
7.3 ngx_array_t動態數組 / 222
7.3.1 為什麼設計ngx_array_t動態數組 / 223
7.3.2 動態數組的使用方法 / 223
7.3.3  使用動態數組的例子 / 225
7.3.4 動態數組的擴容方式 / 226
7.4 ngx_list_t單向鍊表 / 226
7.5 ngx_rbtree_t紅黑樹 / 227
7.5.1 為什麼設計ngx_rbtree_t紅黑樹 / 227
7.5.2 紅黑樹的特性 / 228
7.5.3 紅黑樹的使用方法 / 230
7.5.4 使用紅黑樹的簡單例子 / 233
7.5.5 如何自定義添加成員方法 / 234
7.6 ngx_radix_tree_t基數樹 / 236
7.6.1 ngx_radix_tree_t基數樹的原理 / 236
7.6.2 基數樹的使用方法 / 238
7.6.3 使用基數樹的例子 / 239
7.7 支持通配符的散列表 / 240
7.7.1 ngx_hash_t基本散列表 / 240
7.7.2 支持通配符的散列表 / 243
7.7.3 帶通配符散列表的使用例子 / 250
7.8 小結 / 254
第三部分 深入Nginx
第8章 Nginx基礎架構 / 256
8.1 Web伺服器設計中的關鍵約束 / 256
8.2 Nginx的架構設計 / 259
8.2.1 優秀的模組化設計 / 259
8.2.2 事件驅動架構 / 263
8.2.3 請求的多階段異步處理 / 264
8.2.4 管理進程、多工作進程設計 / 267
8.2.5 平台無關的代碼實現 / 268
8.2.6 記憶體池的設計 / 268
8.2.7 使用統一管道過濾器模式的HTTP過濾模組 / 268
8.2.8 其他一些用戶模組 / 269
8.3 Nginx框架中的核心結構體ngx_cycle_t / 269
8.3.1 ngx_listening_t結構體 / 269
8.3.2 ngx_cycle_t結構體 / 271
8.3.3 ngx_cycle_t支持的方法 / 273
8.4 Nginx啟動時框架的處理流程 / 275
8.5 worker進程是如何工作的 / 278
8.6 master進程是如何工作的 / 281
8.7 小結 / 286
第9章 事件模組 / 287
9.1 事件處理框架概述 / 287
9.2 Nginx事件的定義 / 290
9.3 Nginx連線的定義 / 293
9.3.1 被動連線 / 294
9.3.2 主動連線 / 297
9.3.3 ngx_connection_t連線池 / 298
9.4 ngx_events_module核心模組 / 300
9.4.1 如何管理所有事件模組的配置項 / 301
9.4.2 管理事件模組 / 303
9.5 ngx_event_core_module事件模組 / 305
9.6 epoll事件驅動模組 / 310
9.6.1 epoll的原理和用法 / 311
9.6.2 如何使用epoll / 313
9.6.3 ngx_epoll_module模組的實現 / 315
9.7 定時器事件 / 323
9.7.1 快取時間的管理 / 324
9.7.2 快取時間的精度 / 326
9.7.3 定時器的實現 / 327
9.8 事件驅動框架的處理流程 / 328
9.8.1 如何建立新連線 / 329
9.8.2 如何解決“驚群”問題 / 330
9.8.3 如何實現負載均衡 / 333
9.8.4 post事件佇列 / 334
9.8.5 ngx_process_events_and_timers流程 / 335
9.9 檔案的異步I/O / 338
9.9.1 Linux核心提供的檔案異步I/O / 339
9.9.2 ngx_epoll_module模組中實現的針對檔案的異步I/O / 342
9.10 小結 / 346
第10章 HTTP框架的初始化 / 347
10.1 HTTP框架概述 / 348
10.2 管理HTTP模組的配置項 / 351
10.2.1 管理main級別下的配置項 / 352
10.2.2 管理server級別下的配置項 / 354
10.2.3 管理location級別下的配置項 / 357
10.2.4 不同級別配置項的合併 / 362
10.3 監聽連線埠的管理 / 367
10.4 server的快速檢索 / 369
10.5 location的快速檢索 / 371
10.6 HTTP請求的11個處理階段 / 372
10.6.1 HTTP處理階段的普適規則 / 374
10.6.2 NGX_HTTP_POST_READ_PHASE階段 / 376
10.6.3 NGX_HTTP_SERVER_REWRITE_PHASE階段 / 378
10.6.4 NGX_HTTP_FIND_CONFIG_PHASE階段 / 379
10.6.5 NGX_HTTP_REWRITE_PHASE階段 / 379
10.6.6 NGX_HTTP_POST_REWRITE_PHASE階段 / 379
10.6.7 NGX_HTTP_PREACCESS_PHASE階段 / 379
10.6.8 NGX_HTTP_ACCESS_PHASE階段 / 380
10.6.9 NGX_HTTP_POST_ACCESS_PHASE階段 / 380
10.6.10 NGX_HTTP_TRY_FILES_PHASE階段 / 381
10.6.11 NGX_HTTP_CONTENT_PHASE階段 / 381
10.6.12 NGX_HTTP_LOG_PHASE階段 / 382
10.7 HTTP框架的初始化流程 / 383
10.8 小結 / 385
第11章 HTTP框架的執行流程 / 386
11.1 HTTP框架執行流程概述 / 387
11.2 新連線建立時的行為 / 388
11.3 第一次可讀事件的處理 / 390
11.4 接收HTTP請求行 / 396
11.5 接收HTTP頭部 / 399
11.6 處理HTTP請求 / 403
11.6.1 ngx_http_core_generic_phase / 409
11.6.2 ngx_http_core_rewrite_phase / 411
11.6.3 ngx_http_core_access_phase / 412
11.6.4 ngx_http_core_content_phase / 415
11.7 subrequest與post請求 / 419
11.8 處理HTTP包體 / 421
11.8.1 接收包體 / 422
11.8.2 放棄接收包體 / 429
11.9 傳送HTTP回響 / 433
11.9.1 ngx_http_send_header / 434
11.9.2 ngx_http_output_filter / 436
11.9.3 ngx_http_writer / 440
11.10 結束HTTP請求 / 442
11.10.1 ngx_http_close_connection / 443
11.10.2 ngx_http_free_request / 444
11.10.3 ngx_http_close_request / 446
11.10.4 ngx_http_finalize_connection / 447
11.10.5 ngx_http_terminate_request / 447
11.10.6 ngx_http_finalize_request / 448
11.11 小結 / 452
第12章 upstream機制的設計與實現 / 453
12.1 upstream機制概述 / 453
12.1.1 設計目的 / 454
12.1.2 ngx_http_upstream_t數據結構的意義 / 456
12.1.3 ngx_http_upstream_conf_t配置結構體 / 459
12.2 啟動upstream / 462
12.3 與上游伺服器建立連線 / 464
12.4 傳送請求到上游伺服器 / 467
12.5 接收上游伺服器的回響頭部 / 470
12.5.1 套用層協定的兩段劃分方式 / 470
12.5.2 處理包體的3種方式 / 471
12.5.3 接收回響頭部的流程 / 473
12.6 不轉發回響時的處理流程 / 476
12.6.1 input_filter方法的設計 / 477
12.6.2 默認的input_filter方法 / 478
12.6.3 接收包體的流程 / 479
12.7 以下游網速優先來轉發回響 / 481
12.7.1 轉發回響的包頭 / 482
12.7.2 轉發回響的包體 / 484
12.8 以上游網速優先來轉發回響 / 489
12.8.1 ngx_event_pipe_t結構體的意義 / 489
12.8.2 轉發回響的包頭 / 493
12.8.3 轉發回響的包體 / 495
12.8.4 ngx_event_pipe_read_upstream方法 / 498
12.8.5 ngx_event_pipe_write_to_downstream方法 / 502
12.9 結束upstream請求 / 504
12.10 小結 / 508
第13章 郵件代理模組 / 509
13.1 郵件代理伺服器的功能 / 509
13.2 郵件模組的處理框架 / 512
13.2.1 一個請求的8個獨立處理階段 / 512
13.2.2 郵件類模組的定義 / 514
13.2.3 郵件框架的初始化 / 516
13.3 初始化請求 / 517
13.3.1 描述郵件請求的ngx_mail_session_t結構體 / 517
13.3.2 初始化郵件請求的流程 / 519
13.4 接收並解析客戶端請求 / 520
13.5 郵件認證 / 520
13.5.1 ngx_mail_auth_http_ctx_t結構體 / 520
13.5.2 與認證伺服器建立連線 / 522
13.5.3 傳送請求到認證伺服器 / 522
13.5.4 接收並解析回響 / 525
13.6 與上游郵件伺服器間的認證互動 / 526
13.6.1 ngx_mail_proxy_ctx_t結構體 / 526
13.6.2 向上游郵件伺服器發起連線 / 527
13.6.3 與郵件伺服器認證互動的過程 / 528
13.7 透傳上游郵件伺服器與客戶端間的流 / 530
13.8 小結 / 535
第14章 進程間的通信機制 / 536
14.1 概述 / 536
14.2 共享記憶體 / 536
14.3 原子操作 / 541
14.3.1 不支持原子庫下的原子操作 / 541
14.3.2 x86架構下的原子操作 / 542
14.3.3 自旋鎖 / 545
14.4 Nginx頻道 / 546
14.5 信號 / 549
14.6 信號量 / 551
14.7 檔案鎖 / 553
14.8 互斥鎖 / 556
14.8.1 檔案鎖實現的ngx_shmtx_t鎖 / 558
14.8.2 原子變數實現的ngx_shmtx_t鎖 / 560
14.9 小結 / 565

相關詞條

相關搜尋

熱門詞條

聯絡我們