前 言
第一部分 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
· · · · · · (
收起)