Nginx完全開發指南:使用C,C++,JavaScript和Lua

Nginx完全開發指南:使用C,C++,JavaScript和Lua

《Nginx完全開發指南:使用C、C++、JavaScript和Lua》是2019年6月電子工業出版社出版的圖書,作者是羅劍鋒。

基本介紹

  • 書名:Nginx完全開發指南:使用C、C++、JavaScript和Lua
  • 作者:羅劍鋒  
  • ISBN:9787121364365   
  • 頁數:608頁    
  • 定價:109元   
  • 出版社:電子工業出版社
  • 出版時間:2019年6月   
  • 開本:16開
內容簡介,目錄,

內容簡介

Nginx是著名的Web伺服器,性能優異,運行效率遠超傳統的Apache、Tomcat,廣泛套用於國內外諸多頂級網際網路公司。Nginx的一個突出特點是其靈活優秀的模組化架構,可以在不修改核心的前提下增加任意功能,自2004年發布至今,已經擁有百餘個官方及非官方的功能模組(如proxy、mysql、redis、rtmp、lua等),使得Nginx成長為了一個近乎“全能”的伺服器軟體。Nginx功能強大,架構複雜,學習、維護和開發的門檻較高。為了幫助讀者跨越這一障礙,本書深入最新的Nginx源碼(Stable 1.16.0),詳細剖析了模組體系、動態外掛程式、功能框架、記憶體分配、進程模型、事件驅動、執行緒池、TCP/UDP/HTTP處理等Nginx核心運行機制,在此基礎上講解如何使用C、C++、JavaScript、Lua等語言來增強擴展Nginx,讓任何人都能夠便捷、輕鬆地開發和定製Nginx,進而套用到自己的實際工作中,創造出更多的價值。本書結構嚴謹、脈絡清晰、論述精確、詳略得當、圖文並茂,值得廣大軟體開發工程師、系統運維工程師和編程愛好者擁有。

目錄

第0章 導讀 1
0.1 於本書 1
0.2 讀者對象 3
0.3 讀者要求 4
0.4 運行環境 5
0.5 本書的結構 5
0.6 如何閱讀本書 6
0.7 本書的源碼 7
第1章 Nginx入門 8
1.1 關於Nginx 8
1.1.1 歷史 9
1.1.2 特點 9
1.1.3 進程模型 10
1.1.4 版本 12
1.2 安裝Nginx 12
1.2.1 準備工作 13
1.2.2 快速安裝 13
1.2.3 運行命令 14
1.2.4 驗證安裝 15
1.2.5 定製安裝 16
1.3 配置Nginx 18
1.3.1 語法格式 19
1.3.2 進程管理 20
1.3.3 動態模組 22
1.3.4 運行日誌 22
1.3.5 事件機制 22
1.4 HTTP服務 23
1.4.1 基本配置 24
1.4.3 location配置 25
1.4.4 file配置 26
1.5 TCP/UDP服務 27
1.6 反向代理 28
1.6.1 上游集群 28
1.6.2 負載均衡 29
1.6.3 代理轉發 30
1.7 變數 30
1.8 總結 32
第2章 Nginx開發準備 33
2.1 源碼結構 33
2.2 源碼特點 34
2.2.1 代碼風格 34
2.2.2 代碼最佳化 35
2.2.3 面向對象思想 35
2.3 頭檔案 36
2.4 總結 36
第3章 Nginx基礎設施 37
3.1 常數 37
3.1.1 環境信息 37
3.1.2 版本信息 38
3.1.3 錯誤碼 38
3.2 整數類型 39
3.2.1 標準整數類型 39
3.2.2 自用整數類型 40
3.2.3 無效值 40
3.3 記憶體池 42
3.3.1 結構定義 42
3.3.2 操作函式 43
3.3.3 用法示例 44
3.4 字元串 44
3.4.1 結構定義 44
3.4.2 操作函式 45
3.4.3 用法示例 48
3.5 時間 49
3.5.1 結構定義 49
3.5.2 操作函式 49
3.5.3 用法示例 50
3.6 日期 50
3.6.1 結構定義 50
3.6.2 操作函式 51
3.6.3 用法示例 52
3.7 運行日誌 52
3.7.1 結構定義 52
3.7.2 操作函式 53
3.7.3 用法示例 54
3.8 摘要算法 54
3.8.1 Times33 55
3.8.2 CRC 55
3.8.3 MurmurHash 56
3.8.4 MD5 57
3.8.5 SHA-1 57
3.9 數據編碼 58
3.9.1 Base64 58
3.9.2 HTML/JSON 59
3.10 總結 60
第4章 Nginx高級數據結構 61
4.1 動態數組 61
4.1.1 結構定義 62
4.1.2 操作函式 63
4.1.3 用法示例 64
4.2 單向鍊表 65
4.2.1 結構定義 65
4.2.2 操作函式 66
4.2.3 用法示例 66
4.3 雙端佇列 68
4.3.1 結構定義 68
4.3.2 操作函式 69
4.3.3 用法示例 71
4.4 紅黑樹 72
4.4.1 結構定義 73
4.4.2 操作函式 75
4.4.3 用法示例 76
4.5 緩衝區 78
4.5.1 結構定義 78
4.5.2 操作函式 80
4.5.3 用法示例 81
4.6 數據塊鏈 82
4.6.1 結構定義 82
4.6.2 操作函式 83
4.6.3 用法示例 83
4.7 總結 84
第5章 Nginx開發概述 85
5.1 開發示例 85
5.1.1 模組設計 85
5.1.2 配置解析 86
5.1.3 處理函式 88
5.1.4 模組集成 90
5.1.5 編譯腳本 91
5.1.6 測試驗證 92
5.2 開發流程 92
5.2.1 設計 93
5.2.2 開發 93
5.2.3 編譯 94
5.2.4 測試驗證 94
5.2.5 調優 94
5.2.6 流程圖 95
5.3 編譯腳本 95
5.3.1 運行機制 96
5.3.2 腳本變數 96
5.3.3 添加模組 97
5.3.4 腳本格式 97
5.3.5 舊式腳本 98
5.4 總結 99
第6章 Nginx模組體系 100
6.1 模組架構 100
6.1.1 結構定義 100
6.1.2 模組的簽名 102
6.1.3 模組的種類 103
6.1.4 模組的函式指針表 104
6.1.5 模組的類圖 105
6.1.6 模組的組織形式 106
6.1.7 模組的靜態載入 108
6.1.8 模組的動態載入 110
6.2 配置解析 113
6.2.1 結構定義 113
6.2.2 基本流程 116
6.2.3 存儲模型 118
6.2.4 訪問配置數據 122
6.2.5 配置數據的位置 123
6.2.6 配置數據的解析 124
6.2.7 配置數據的合併 126
6.2.8 配置指令的類型 127
6.3 源碼分析 128
6.3.1 ngx_core_module 128
6.3.2 ngx_errlog_module 130
6.4 總結 132
第7章 Nginx功能框架 134
7.1 框架簡介 134
7.1.1 模組分類 134
7.1.2 處理流程 135
7.1.3 請求的處理階段 137
7.1.4 請求結構體 138
7.1.5 請求的環境數據 140
7.2 處理引擎 141
7.2.1 函式原型 141
7.2.2 處理函式的存儲方式 141
7.2.3 內容處理函式 142
7.2.4 引擎的數據結構 143
7.2.5 引擎的初始化 144
7.2.6 引擎的運行機制 145
7.2.7 日誌階段的處理 148
7.3 過濾引擎 148
7.3.1 函式原型 148
7.3.2 過濾函式鍊表 149
7.3.3 過濾函式的順序 150
7.3.4 過濾鍊表的運行機制 152
7.3.5 請求體過濾 153
7.4 源碼分析 153
7.4.1 ngx_http_static_module 154
7.4.2 ngx_http_not_modified_filter_module 155
7.5 總結 156
第8章 Nginx請求處理 158
8.1 狀態碼 158
8.2 請求結構體 159
8.3 請求行 160
8.3.1 請求方法 160
8.3.2 協定版本號 161
8.3.3 資源標識符 161
8.4 請求頭 162
8.5 請求體 163
8.5.1 結構定義 163
8.5.2 操作函式 164
8.6 回響頭 164
8.6.1 結構定義 164
8.6.2 操作函式 165
8.7 回響體 166
8.8 源碼分析 166
8.8.1 ngx_http_static_module 166
8.8.2 ngx_http_not_modified_filter_module 168
8.9 開發示例:content handler 169
8.9.1 模組設計 169
8.9.2 配置數據 169
8.9.3 處理函式 170
8.9.4 註冊函式 171
8.9.5 模組集成 172
8.9.6 編譯腳本 173
8.9.7 測試驗證 173
8.10 開發示例:filter 173
8.10.1 模組設計 173
8.10.2 配置數據 174
8.10.3 環境數據 174
8.10.4 註冊過濾函式 175
8.10.5 過濾回響頭 175
8.10.6 過濾回響體 176
8.10.7 模組集成 178
8.10.8 編譯腳本 179
8.10.9 測試驗證 179
8.11 總結 180
第9章 Nginx請求轉發 181
9.1 框架簡介 181
9.1.1 工作原理 182
9.1.2 請求結構體 183
9.1.3 上游結構體 184
9.1.4 上游配置參數 185
9.2 請求轉發 186
9.2.1 回調函式 186
9.2.2 初始化 188
9.2.3 設定參數 189
9.2.4 啟動連線 190
9.2.5 處理回響頭 190
9.2.6 處理回響體 191
9.3 負載均衡 192
9.3.1 結構定義 192
9.3.2 初始化模組入口 196
9.3.3 初始化地址列表 197
9.3.4 初始化算法 199
9.3.5 執行算法 200
9.4 源碼分析 200
9.4.1 ngx_http_memcached_module 201
9.4.2 ngx_http_upstream_ip_hash_module 203
9.5 開發示例:upstream 206
9.5.1 模組設計 206
9.5.2 配置數據 206
9.5.3 上行數據 208
9.5.4 下行數據 208
9.5.5 啟動轉發 209
9.5.6 註冊函式 210
9.5.7 模組集成 210
9.5.8 編譯腳本 211
9.5.9 測試驗證 212
9.6 開發示例:balance 212
9.6.1 模組設計 212
9.6.2 配置數據 212
9.6.3 算法數據結構 213
9.6.4 模組入口 213
9.6.5 算法實現 214
9.6.6 模組集成 215
9.6.7 編譯腳本 216
9.6.8 測試驗證 216
9.7 總結 216
第10章 Nginx子請求 218
10.1 框架簡介 218
10.1.1 工作原理 219
10.1.2 請求結構體 220
10.1.3 回調函式 221
10.1.4 待處理請求鍊表 223
10.1.5 子請求存儲結構 223
10.2 運行機制 223
10.2.1 創建子請求 224
10.2.2 處理引擎 228
10.2.3 數據整理 229
10.3 開發示例 230
10.3.1 模組設計 231
10.3.2 配置數據 231
10.3.3 環境數據 231
10.3.4 回調函式 231
10.3.5 處理函式 232
10.3.6 註冊函式 233
10.3.7 測試驗證 234
10.4 總結 234
第11章 Nginx變數 236
11.1 結構定義 236
11.1.1 變數 237
11.1.2 複雜變數 238
11.1.3 變數的存儲 239
11.1.4 請求結構體 239
11.2 操作變數 240
11.2.1 添加變數 240
11.2.2 獲取變數 241
11.2.3 修改變數 242
11.2.4 編譯複雜變數 242
11.2.5 獲取複雜變數 242
11.3 開發示例:變數 243
11.3.1 模組設計 243
11.3.2 定義變數 243
11.3.3 添加變數 244
11.3.4 獲取變數 244
11.3.5 測試驗證 245
11.4 開發示例:複雜變數 246
11.4.1 模組設計 246
11.4.2 定義複雜變數 246
11.4.3 編譯複雜變數 246
11.4.4 獲取複雜變數 247
11.4.5 測試驗證 247
11.5 總結 247
第12章 Nginx記憶體管理機制 249
12.1 基本系統調用 250
12.1.1 malloc 250
12.1.2 posix_memalign 251
12.1.3 free 251
12.2 塊式記憶體池 252
12.2.1 結構定義 252
12.2.2 常量定義 255
12.2.3 創建記憶體池 255
12.2.4 分配記憶體 257
12.2.5 分配大塊記憶體 258
12.2.6 分配小塊記憶體 259
12.2.7 釋放記憶體 264
12.2.8 清理機制 264
12.2.9 清空記憶體池 265
12.2.10 銷毀記憶體池 266
12.3 頁式記憶體池 267
12.3.1 結構定義 268
12.3.2 常量定義 270
12.3.3 初始化記憶體池 271
12.3.4 分配記憶體 273
12.3.5 分配大塊記憶體 275
12.3.6 分配小塊記憶體 277
12.3.7 釋放記憶體 280
12.4 總結 282
第13章 Nginx進程機制 284
13.1 基本系統調用 284
13.1.1 errno 284
13.1.2 getrlimit 285
13.2 進程系統調用 285
13.2.1 getpid 285
13.2.2 fork 286
13.2.3 waitpid 286
13.3 信號系統調用 287
13.3.1 kill 287
13.3.2 sigaction 288
13.3.3 sigsuspend 288
13.4 結構定義 288
13.4.1 ngx_cycle_t 288
13.4.2 ngx_core_conf_t 289
13.4.3 ngx_process_t 290
13.5 全局變數 291
13.5.1 命令行相關 291
13.5.2 作業系統相關 292
13.5.3 進程功能相關 292
13.5.4 信號功能相關 293
13.6 啟動過程 293
13.6.1 基本流程 293
13.6.2 解析命令行 294
13.6.3 版本和幫助信息 294
13.6.4 初始化cycle 294
13.6.5 測試配置 296
13.6.6 傳送信號 297
13.6.7 守護進程化 297
13.6.8 啟動工作進程 298
13.6.9 流程圖 298
13.7 信號處理 299
13.7.1 信號處理函式 300
13.7.2 傳送信號 300
13.7.3 處理信號 301
13.8 單進程模式 302
13.8.1 single進程 302
13.8.2 single進程流程圖 304
13.9 多進程模式 304
13.9.1 產生子進程 304
13.9.2 master進程 306
13.9.3 master進程流程圖 309
13.9.4 worker進程 310
13.9.5 worker進程流程圖 312
13.10 總結 313
第14章 Nginx進程間通信機制 315
14.1 基本系統調用 315
14.1.1 atomic 315
14.1.2 sched_yield 316
14.1.3 semaphore 316
14.1.4 mmap 317
14.2 共享記憶體(Ⅰ) 317
14.2.1 結構定義 317
14.2.2 創建共享記憶體 317
14.2.3 使用共享記憶體 318
14.3 自旋鎖 318
14.3.1 自旋鎖定 319
14.3.2 解除鎖定 320
14.3.3 使用自旋鎖 320
14.4 互斥鎖 320
14.4.1 結構定義 320
14.4.2 創建互斥鎖 321
14.4.3 互斥鎖定 322
14.4.4 解除鎖定 323
14.4.5 銷毀互斥鎖 324
14.4.6 使用互斥鎖 324
14.5 讀寫鎖 325
14.5.1 寫鎖定 325
14.5.2 讀鎖定 325
14.5.3 解除鎖定 326
14.5.4 降級鎖定 326
14.5.5 使用讀寫鎖 327
14.6 共享記憶體(Ⅱ) 327
14.6.1 結構定義 327
14.6.2 添加共享記憶體 328
14.6.3 創建共享記憶體 329
14.6.4 使用共享記憶體 330
14.7 總結 331
第15章 Nginx事件機制 333
15.1 基本系統調用 333
15.1.1 errno 334
15.1.2 ioctl 334
15.1.3 setitimer 334
15.1.4 gettimeofday 334
15.2 socket系統調用 335
15.2.1 socket 335
15.2.2 bind 335
15.2.3 listen 336
15.2.4 accept 336
15.2.5 connect 336
15.2.6 recv 336
15.2.7 send 337
15.2.8 setsockopt 337
15.2.9 close 337
15.2.10 函式關係圖 338
15.3 epoll系統調用 338
15.3.1 epoll_create 339
15.3.2 epoll_ctl 339
15.3.3 epoll_wait 340
15.3.4 LT和ET 341
15.3.5 函式關係圖 342
15.4 結構定義 342
15.4.1 ngx_event_t 342
15.4.2 ngx_connection_t 343
15.4.3 ngx_listening_t 345
15.4.4 ngx_cycle_t 346
15.4.5 ngx_os_io_t 347
15.4.6 ngx_event_actions_t 351
15.4.7 ngx_posted_events 353
15.4.8 關係圖 354
15.5 定時器 354
15.5.1 紅黑樹 354
15.5.2 操作函式 355
15.5.3 逾時處理 355
15.6 模組體系 358
15.6.1 函式指針表 358
15.6.2 模組的組織形式 359
15.6.3 核心配置 361
15.6.4 epoll模組 362
15.7 全局變數 363
15.7.1 更新時間相關 363
15.7.2 事件機制相關 364
15.7.3 負載均衡相關 365
15.7.4 統計相關 365
15.8 進程初始化 366
15.8.1 初始化函式 366
15.8.2 基本參數初始化 368
15.8.3 事件機制初始化 369
15.8.4 連線池初始化 370
15.8.5 監聽連線埠初始化 371
15.8.6 初始化流程圖 373
15.9 運行機制 373
15.9.1 添加事件 374
15.9.2 刪除事件 377
15.9.3 處理事件 378
15.9.4 接受連線 382
15.9.5 負載均衡 384
15.10 避免阻塞 389
15.11 總結 390
第16章 Nginx多執行緒機制 392
16.1 eventfd系統調用 392
16.2 pthread系統調用 393
16.3 結構定義 393
16.3.1 ngx_thread_task_t 394
16.3.2 ngx_thread_pool_queue_t 394
16.3.3 ngx_thread_pool_t 395
16.3.4 結構關係圖 396
16.4 事件通知 396
16.4.1 函式接口 396
16.4.2 初始化 397
16.4.3 傳送通知 398
16.4.4 處理通知 398
16.5 運行機制 399
16.5.1 完成任務佇列 399
16.5.2 創建執行緒池 399
16.5.3 創建任務 400
16.5.4 投遞任務 401
16.5.5 執行任務 402
16.5.6 任務完成回調 404
16.5.7 銷毀執行緒池 405
16.6 開發示例 406
16.6.1 模組設計 406
16.6.2 配置數據 407
16.6.3 執行緒任務 407
16.6.4 任務完成回調 408
16.6.5 投遞任務 409
16.6.6 測試驗證 410
16.7 總結 410
第17章 Nginx Stream機制 412
17.1 模組體系 412
17.1.1 函式指針表 413
17.1.2 基礎模組 413
17.1.3 核心模組 415
17.1.4 結構關係圖 416
17.1.5 存儲模型 416
17.2 監聽連線埠 418
17.2.1 結構定義 418
17.2.2 解析配置 420
17.2.3 啟動監聽 424
17.3 處理引擎 425
17.3.1 階段定義 426
17.3.2 函式原型 426
17.3.3 處理函式的存儲方式 426
17.3.4 引擎數據結構 427
17.3.5 結構關係圖 428
17.3.6 引擎的初始化 428
17.4 過濾引擎 430
17.4.1 函式原型 430
17.4.2 過濾函式鍊表 430
17.5 運行機制 431
17.5.1 會話結構體 431
17.5.2 創建會話 432
17.5.3 執行引擎 435
17.5.4 通用階段處理 437
17.5.5 預讀數據 438
17.5.6 產生回響數據 442
17.5.7 過濾數據 442
17.5.8 結束會話 442
17.6 開發示例 443
17.6.1 discard協定 444
17.6.2 time協定 446
17.6.3 echo協定 448
17.7 總結 450
第18章 Nginx HTTP機制 452
18.1 結構定義 452
18.1.1 ngx_http_state_e 452
18.1.2 ngx_http_connection_t 453
18.1.3 ngx_http_request_t 453
18.2 初始化連線 454
18.2.1 建立連線 455
18.2.2 等待數據 456
18.2.3 讀取請求頭 458
18.3 執行引擎 463
18.3.1 初始化引擎 463
18.3.2 通用階段 465
18.3.3 改寫階段 466
18.3.4 訪問控制階段 467
18.3.5 內容產生階段 469
18.4 處理請求體 470
18.4.1 丟棄緩衝區數據 470
18.4.2 讀取並丟棄數據 471
18.4.3 讀事件處理函式 473
18.4.4 啟動丟棄處理 474
18.5 傳送數據 475
18.5.1 傳送初始化 475
18.5.2 事件處理函式 476
18.6 結束請求 478
18.6.1 釋放請求資源 478
18.6.2 檢查引用計數結束請求 479
18.6.3 檢查狀態結束請求 480
18.6.4 綜合處理結束請求 481
18.7 總結 483
第19章 Nginx與設計模式 485
19.1 設計模式簡介 485
19.2 框架級別的模式 485
19.3 業務級別的模式 487
19.4 代碼級別的模式 488
19.5 總結 490
第20章 Nginx C++開發 491
20.1 語言簡介 491
20.2 開發準備 492
20.2.1 程式庫 492
20.2.2 頭檔案 492
20.2.3 編程範式 493
20.2.4 實現原則 493
20.2.5 源碼組織 494
20.2.6 編譯腳本 495
20.3 封裝類 497
20.3.1 基礎設施 497
20.3.2 高級數據結構 500
20.3.3 功能框架 505
20.3.4 請求處理 509
20.4 開發示例:content handler 510
20.4.1 配置信息類 510
20.4.2 業務邏輯類 511
20.4.3 模組集成類 512
20.4.4 實現源檔案 515
20.5 開發示例:filter 515
20.5.1 配置信息類 515
20.5.2 環境數據類 515
20.5.3 業務邏輯類 516
20.5.4 模組集成類 518
20.5.5 實現源檔案 519
20.6 總結 519
第21章 Nginx JavaScript開發 521
21.1 語言簡介 521
21.2 模組簡介 522
21.3 開發準備 523
21.4 指令簡介 523
21.5 功能接口 524
21.5.1 運行日誌 524
21.5.2 變數 525
21.5.3 請求處理 525
21.5.4 子請求 527
21.5.5 定時器 527
21.5.6 流處理 527
21.6 開發示例 528
21.6.1 content handler 528
21.6.2 subrequest 529
21.6.3 A/B testing 530
21.7 總結 531
第22章 Nginx Lua開發 532
22.1 語言簡介 532
22.2 模組簡介 533
22.2.1 http_lua 533
22.2.2 stream_lua 533
22.2.3 lua-resty-lib 534
22.3 開發準備 534
22.4 指令簡介 535
22.4.1 配置指令 536
22.4.2 功能指令 536
22.4.3 指令關係圖 538
22.5 套用開發流程 538
22.6 功能接口 539
22.6.1 運行日誌 539
22.6.2 時間與日期 540
22.6.3 變數 540
22.6.4 正則表達式 541
22.6.5 請求處理 542
22.6.6 請求轉發 544
22.6.7 子請求 545
22.6.8 定時器 546
22.6.9 共享記憶體 546
22.7 開發示例 547
22.7.1 content handler 548
22.7.2 filter 549
22.7.3 upstream 550
22.7.4 subrequest 550
22.7.5 discard 551
22.7.6 echo 552
22.8 總結 552
第23章 Nginx調試與測試 554
23.1 調試 554
23.1.1 調試器 554
23.1.2 調試斷點 555
23.1.3 調試日誌 556
23.2 功能測試 558
23.2.1 測試套件 559
23.2.2 測試用例 559
23.2.3 運行測試 564
23.3 性能測試 564
23.3.1 ab 565
23.3.2 http_load 565
23.3.3 wrk 566
23.3.4 Test::Nginx 567
23.4 總結 568
第24章 Nginx性能分析 569
24.1 簡介 569
24.2 火焰圖 570
24.3 分析工具 572
24.3.1 使用方式 572
24.3.2 處理數據 573
24.4 動態追蹤 576
24.4.1 CPU分析 577
24.4.2 I/O分析 579
24.4.3 Memory分析 580
24.4.4 觀測工具 581
24.5 總結 582
第25章 結束語 583
25.1 本書的遺憾 583
25.2 下一步 583
25.3 臨別贈言 584
附錄A 推薦書目 585
附錄B 字元串格式化 587
附錄C 開發輔助工具 589,
第0章 導讀 1
0.1 於本書 1
0.2 讀者對象 3
0.3 讀者要求 4
0.4 運行環境 5
0.5 本書的結構 5
0.6 如何閱讀本書 6
0.7 本書的源碼 7
第1章 Nginx入門 8
1.1 關於Nginx 8
1.1.1 歷史 9
1.1.2 特點 9
1.1.3 進程模型 10
1.1.4 版本 12
1.2 安裝Nginx 12
1.2.1 準備工作 13
1.2.2 快速安裝 13
1.2.3 運行命令 14
1.2.4 驗證安裝 15
1.2.5 定製安裝 16
1.3 配置Nginx 18
1.3.1 語法格式 19
1.3.2 進程管理 20
1.3.3 動態模組 22
1.3.4 運行日誌 22
1.3.5 事件機制 22
1.4 HTTP服務 23
1.4.1 基本配置 24
1.4.3 location配置 25
1.4.4 file配置 26
1.5 TCP/UDP服務 27
1.6 反向代理 28
1.6.1 上游集群 28
1.6.2 負載均衡 29
1.6.3 代理轉發 30
1.7 變數 30
1.8 總結 32
第2章 Nginx開發準備 33
2.1 源碼結構 33
2.2 源碼特點 34
2.2.1 代碼風格 34
2.2.2 代碼最佳化 35
2.2.3 面向對象思想 35
2.3 頭檔案 36
2.4 總結 36
第3章 Nginx基礎設施 37
3.1 常數 37
3.1.1 環境信息 37
3.1.2 版本信息 38
3.1.3 錯誤碼 38
3.2 整數類型 39
3.2.1 標準整數類型 39
3.2.2 自用整數類型 40
3.2.3 無效值 40
3.3 記憶體池 42
3.3.1 結構定義 42
3.3.2 操作函式 43
3.3.3 用法示例 44
3.4 字元串 44
3.4.1 結構定義 44
3.4.2 操作函式 45
3.4.3 用法示例 48
3.5 時間 49
3.5.1 結構定義 49
3.5.2 操作函式 49
3.5.3 用法示例 50
3.6 日期 50
3.6.1 結構定義 50
3.6.2 操作函式 51
3.6.3 用法示例 52
3.7 運行日誌 52
3.7.1 結構定義 52
3.7.2 操作函式 53
3.7.3 用法示例 54
3.8 摘要算法 54
3.8.1 Times33 55
3.8.2 CRC 55
3.8.3 MurmurHash 56
3.8.4 MD5 57
3.8.5 SHA-1 57
3.9 數據編碼 58
3.9.1 Base64 58
3.9.2 HTML/JSON 59
3.10 總結 60
第4章 Nginx高級數據結構 61
4.1 動態數組 61
4.1.1 結構定義 62
4.1.2 操作函式 63
4.1.3 用法示例 64
4.2 單向鍊表 65
4.2.1 結構定義 65
4.2.2 操作函式 66
4.2.3 用法示例 66
4.3 雙端佇列 68
4.3.1 結構定義 68
4.3.2 操作函式 69
4.3.3 用法示例 71
4.4 紅黑樹 72
4.4.1 結構定義 73
4.4.2 操作函式 75
4.4.3 用法示例 76
4.5 緩衝區 78
4.5.1 結構定義 78
4.5.2 操作函式 80
4.5.3 用法示例 81
4.6 數據塊鏈 82
4.6.1 結構定義 82
4.6.2 操作函式 83
4.6.3 用法示例 83
4.7 總結 84
第5章 Nginx開發概述 85
5.1 開發示例 85
5.1.1 模組設計 85
5.1.2 配置解析 86
5.1.3 處理函式 88
5.1.4 模組集成 90
5.1.5 編譯腳本 91
5.1.6 測試驗證 92
5.2 開發流程 92
5.2.1 設計 93
5.2.2 開發 93
5.2.3 編譯 94
5.2.4 測試驗證 94
5.2.5 調優 94
5.2.6 流程圖 95
5.3 編譯腳本 95
5.3.1 運行機制 96
5.3.2 腳本變數 96
5.3.3 添加模組 97
5.3.4 腳本格式 97
5.3.5 舊式腳本 98
5.4 總結 99
第6章 Nginx模組體系 100
6.1 模組架構 100
6.1.1 結構定義 100
6.1.2 模組的簽名 102
6.1.3 模組的種類 103
6.1.4 模組的函式指針表 104
6.1.5 模組的類圖 105
6.1.6 模組的組織形式 106
6.1.7 模組的靜態載入 108
6.1.8 模組的動態載入 110
6.2 配置解析 113
6.2.1 結構定義 113
6.2.2 基本流程 116
6.2.3 存儲模型 118
6.2.4 訪問配置數據 122
6.2.5 配置數據的位置 123
6.2.6 配置數據的解析 124
6.2.7 配置數據的合併 126
6.2.8 配置指令的類型 127
6.3 源碼分析 128
6.3.1 ngx_core_module 128
6.3.2 ngx_errlog_module 130
6.4 總結 132
第7章 Nginx功能框架 134
7.1 框架簡介 134
7.1.1 模組分類 134
7.1.2 處理流程 135
7.1.3 請求的處理階段 137
7.1.4 請求結構體 138
7.1.5 請求的環境數據 140
7.2 處理引擎 141
7.2.1 函式原型 141
7.2.2 處理函式的存儲方式 141
7.2.3 內容處理函式 142
7.2.4 引擎的數據結構 143
7.2.5 引擎的初始化 144
7.2.6 引擎的運行機制 145
7.2.7 日誌階段的處理 148
7.3 過濾引擎 148
7.3.1 函式原型 148
7.3.2 過濾函式鍊表 149
7.3.3 過濾函式的順序 150
7.3.4 過濾鍊表的運行機制 152
7.3.5 請求體過濾 153
7.4 源碼分析 153
7.4.1 ngx_http_static_module 154
7.4.2 ngx_http_not_modified_filter_module 155
7.5 總結 156
第8章 Nginx請求處理 158
8.1 狀態碼 158
8.2 請求結構體 159
8.3 請求行 160
8.3.1 請求方法 160
8.3.2 協定版本號 161
8.3.3 資源標識符 161
8.4 請求頭 162
8.5 請求體 163
8.5.1 結構定義 163
8.5.2 操作函式 164
8.6 回響頭 164
8.6.1 結構定義 164
8.6.2 操作函式 165
8.7 回響體 166
8.8 源碼分析 166
8.8.1 ngx_http_static_module 166
8.8.2 ngx_http_not_modified_filter_module 168
8.9 開發示例:content handler 169
8.9.1 模組設計 169
8.9.2 配置數據 169
8.9.3 處理函式 170
8.9.4 註冊函式 171
8.9.5 模組集成 172
8.9.6 編譯腳本 173
8.9.7 測試驗證 173
8.10 開發示例:filter 173
8.10.1 模組設計 173
8.10.2 配置數據 174
8.10.3 環境數據 174
8.10.4 註冊過濾函式 175
8.10.5 過濾回響頭 175
8.10.6 過濾回響體 176
8.10.7 模組集成 178
8.10.8 編譯腳本 179
8.10.9 測試驗證 179
8.11 總結 180
第9章 Nginx請求轉發 181
9.1 框架簡介 181
9.1.1 工作原理 182
9.1.2 請求結構體 183
9.1.3 上游結構體 184
9.1.4 上游配置參數 185
9.2 請求轉發 186
9.2.1 回調函式 186
9.2.2 初始化 188
9.2.3 設定參數 189
9.2.4 啟動連線 190
9.2.5 處理回響頭 190
9.2.6 處理回響體 191
9.3 負載均衡 192
9.3.1 結構定義 192
9.3.2 初始化模組入口 196
9.3.3 初始化地址列表 197
9.3.4 初始化算法 199
9.3.5 執行算法 200
9.4 源碼分析 200
9.4.1 ngx_http_memcached_module 201
9.4.2 ngx_http_upstream_ip_hash_module 203
9.5 開發示例:upstream 206
9.5.1 模組設計 206
9.5.2 配置數據 206
9.5.3 上行數據 208
9.5.4 下行數據 208
9.5.5 啟動轉發 209
9.5.6 註冊函式 210
9.5.7 模組集成 210
9.5.8 編譯腳本 211
9.5.9 測試驗證 212
9.6 開發示例:balance 212
9.6.1 模組設計 212
9.6.2 配置數據 212
9.6.3 算法數據結構 213
9.6.4 模組入口 213
9.6.5 算法實現 214
9.6.6 模組集成 215
9.6.7 編譯腳本 216
9.6.8 測試驗證 216
9.7 總結 216
第10章 Nginx子請求 218
10.1 框架簡介 218
10.1.1 工作原理 219
10.1.2 請求結構體 220
10.1.3 回調函式 221
10.1.4 待處理請求鍊表 223
10.1.5 子請求存儲結構 223
10.2 運行機制 223
10.2.1 創建子請求 224
10.2.2 處理引擎 228
10.2.3 數據整理 229
10.3 開發示例 230
10.3.1 模組設計 231
10.3.2 配置數據 231
10.3.3 環境數據 231
10.3.4 回調函式 231
10.3.5 處理函式 232
10.3.6 註冊函式 233
10.3.7 測試驗證 234
10.4 總結 234
第11章 Nginx變數 236
11.1 結構定義 236
11.1.1 變數 237
11.1.2 複雜變數 238
11.1.3 變數的存儲 239
11.1.4 請求結構體 239
11.2 操作變數 240
11.2.1 添加變數 240
11.2.2 獲取變數 241
11.2.3 修改變數 242
11.2.4 編譯複雜變數 242
11.2.5 獲取複雜變數 242
11.3 開發示例:變數 243
11.3.1 模組設計 243
11.3.2 定義變數 243
11.3.3 添加變數 244
11.3.4 獲取變數 244
11.3.5 測試驗證 245
11.4 開發示例:複雜變數 246
11.4.1 模組設計 246
11.4.2 定義複雜變數 246
11.4.3 編譯複雜變數 246
11.4.4 獲取複雜變數 247
11.4.5 測試驗證 247
11.5 總結 247
第12章 Nginx記憶體管理機制 249
12.1 基本系統調用 250
12.1.1 malloc 250
12.1.2 posix_memalign 251
12.1.3 free 251
12.2 塊式記憶體池 252
12.2.1 結構定義 252
12.2.2 常量定義 255
12.2.3 創建記憶體池 255
12.2.4 分配記憶體 257
12.2.5 分配大塊記憶體 258
12.2.6 分配小塊記憶體 259
12.2.7 釋放記憶體 264
12.2.8 清理機制 264
12.2.9 清空記憶體池 265
12.2.10 銷毀記憶體池 266
12.3 頁式記憶體池 267
12.3.1 結構定義 268
12.3.2 常量定義 270
12.3.3 初始化記憶體池 271
12.3.4 分配記憶體 273
12.3.5 分配大塊記憶體 275
12.3.6 分配小塊記憶體 277
12.3.7 釋放記憶體 280
12.4 總結 282
第13章 Nginx進程機制 284
13.1 基本系統調用 284
13.1.1 errno 284
13.1.2 getrlimit 285
13.2 進程系統調用 285
13.2.1 getpid 285
13.2.2 fork 286
13.2.3 waitpid 286
13.3 信號系統調用 287
13.3.1 kill 287
13.3.2 sigaction 288
13.3.3 sigsuspend 288
13.4 結構定義 288
13.4.1 ngx_cycle_t 288
13.4.2 ngx_core_conf_t 289
13.4.3 ngx_process_t 290
13.5 全局變數 291
13.5.1 命令行相關 291
13.5.2 作業系統相關 292
13.5.3 進程功能相關 292
13.5.4 信號功能相關 293
13.6 啟動過程 293
13.6.1 基本流程 293
13.6.2 解析命令行 294
13.6.3 版本和幫助信息 294
13.6.4 初始化cycle 294
13.6.5 測試配置 296
13.6.6 傳送信號 297
13.6.7 守護進程化 297
13.6.8 啟動工作進程 298
13.6.9 流程圖 298
13.7 信號處理 299
13.7.1 信號處理函式 300
13.7.2 傳送信號 300
13.7.3 處理信號 301
13.8 單進程模式 302
13.8.1 single進程 302
13.8.2 single進程流程圖 304
13.9 多進程模式 304
13.9.1 產生子進程 304
13.9.2 master進程 306
13.9.3 master進程流程圖 309
13.9.4 worker進程 310
13.9.5 worker進程流程圖 312
13.10 總結 313
第14章 Nginx進程間通信機制 315
14.1 基本系統調用 315
14.1.1 atomic 315
14.1.2 sched_yield 316
14.1.3 semaphore 316
14.1.4 mmap 317
14.2 共享記憶體(Ⅰ) 317
14.2.1 結構定義 317
14.2.2 創建共享記憶體 317
14.2.3 使用共享記憶體 318
14.3 自旋鎖 318
14.3.1 自旋鎖定 319
14.3.2 解除鎖定 320
14.3.3 使用自旋鎖 320
14.4 互斥鎖 320
14.4.1 結構定義 320
14.4.2 創建互斥鎖 321
14.4.3 互斥鎖定 322
14.4.4 解除鎖定 323
14.4.5 銷毀互斥鎖 324
14.4.6 使用互斥鎖 324
14.5 讀寫鎖 325
14.5.1 寫鎖定 325
14.5.2 讀鎖定 325
14.5.3 解除鎖定 326
14.5.4 降級鎖定 326
14.5.5 使用讀寫鎖 327
14.6 共享記憶體(Ⅱ) 327
14.6.1 結構定義 327
14.6.2 添加共享記憶體 328
14.6.3 創建共享記憶體 329
14.6.4 使用共享記憶體 330
14.7 總結 331
第15章 Nginx事件機制 333
15.1 基本系統調用 333
15.1.1 errno 334
15.1.2 ioctl 334
15.1.3 setitimer 334
15.1.4 gettimeofday 334
15.2 socket系統調用 335
15.2.1 socket 335
15.2.2 bind 335
15.2.3 listen 336
15.2.4 accept 336
15.2.5 connect 336
15.2.6 recv 336
15.2.7 send 337
15.2.8 setsockopt 337
15.2.9 close 337
15.2.10 函式關係圖 338
15.3 epoll系統調用 338
15.3.1 epoll_create 339
15.3.2 epoll_ctl 339
15.3.3 epoll_wait 340
15.3.4 LT和ET 341
15.3.5 函式關係圖 342
15.4 結構定義 342
15.4.1 ngx_event_t 342
15.4.2 ngx_connection_t 343
15.4.3 ngx_listening_t 345
15.4.4 ngx_cycle_t 346
15.4.5 ngx_os_io_t 347
15.4.6 ngx_event_actions_t 351
15.4.7 ngx_posted_events 353
15.4.8 關係圖 354
15.5 定時器 354
15.5.1 紅黑樹 354
15.5.2 操作函式 355
15.5.3 逾時處理 355
15.6 模組體系 358
15.6.1 函式指針表 358
15.6.2 模組的組織形式 359
15.6.3 核心配置 361
15.6.4 epoll模組 362
15.7 全局變數 363
15.7.1 更新時間相關 363
15.7.2 事件機制相關 364
15.7.3 負載均衡相關 365
15.7.4 統計相關 365
15.8 進程初始化 366
15.8.1 初始化函式 366
15.8.2 基本參數初始化 368
15.8.3 事件機制初始化 369
15.8.4 連線池初始化 370
15.8.5 監聽連線埠初始化 371
15.8.6 初始化流程圖 373
15.9 運行機制 373
15.9.1 添加事件 374
15.9.2 刪除事件 377
15.9.3 處理事件 378
15.9.4 接受連線 382
15.9.5 負載均衡 384
15.10 避免阻塞 389
15.11 總結 390
第16章 Nginx多執行緒機制 392
16.1 eventfd系統調用 392
16.2 pthread系統調用 393
16.3 結構定義 393
16.3.1 ngx_thread_task_t 394
16.3.2 ngx_thread_pool_queue_t 394
16.3.3 ngx_thread_pool_t 395
16.3.4 結構關係圖 396
16.4 事件通知 396
16.4.1 函式接口 396
16.4.2 初始化 397
16.4.3 傳送通知 398
16.4.4 處理通知 398
16.5 運行機制 399
16.5.1 完成任務佇列 399
16.5.2 創建執行緒池 399
16.5.3 創建任務 400
16.5.4 投遞任務 401
16.5.5 執行任務 402
16.5.6 任務完成回調 404
16.5.7 銷毀執行緒池 405
16.6 開發示例 406
16.6.1 模組設計 406
16.6.2 配置數據 407
16.6.3 執行緒任務 407
16.6.4 任務完成回調 408
16.6.5 投遞任務 409
16.6.6 測試驗證 410
16.7 總結 410
第17章 Nginx Stream機制 412
17.1 模組體系 412
17.1.1 函式指針表 413
17.1.2 基礎模組 413
17.1.3 核心模組 415
17.1.4 結構關係圖 416
17.1.5 存儲模型 416
17.2 監聽連線埠 418
17.2.1 結構定義 418
17.2.2 解析配置 420
17.2.3 啟動監聽 424
17.3 處理引擎 425
17.3.1 階段定義 426
17.3.2 函式原型 426
17.3.3 處理函式的存儲方式 426
17.3.4 引擎數據結構 427
17.3.5 結構關係圖 428
17.3.6 引擎的初始化 428
17.4 過濾引擎 430
17.4.1 函式原型 430
17.4.2 過濾函式鍊表 430
17.5 運行機制 431
17.5.1 會話結構體 431
17.5.2 創建會話 432
17.5.3 執行引擎 435
17.5.4 通用階段處理 437
17.5.5 預讀數據 438
17.5.6 產生回響數據 442
17.5.7 過濾數據 442
17.5.8 結束會話 442
17.6 開發示例 443
17.6.1 discard協定 444
17.6.2 time協定 446
17.6.3 echo協定 448
17.7 總結 450
第18章 Nginx HTTP機制 452
18.1 結構定義 452
18.1.1 ngx_http_state_e 452
18.1.2 ngx_http_connection_t 453
18.1.3 ngx_http_request_t 453
18.2 初始化連線 454
18.2.1 建立連線 455
18.2.2 等待數據 456
18.2.3 讀取請求頭 458
18.3 執行引擎 463
18.3.1 初始化引擎 463
18.3.2 通用階段 465
18.3.3 改寫階段 466
18.3.4 訪問控制階段 467
18.3.5 內容產生階段 469
18.4 處理請求體 470
18.4.1 丟棄緩衝區數據 470
18.4.2 讀取並丟棄數據 471
18.4.3 讀事件處理函式 473
18.4.4 啟動丟棄處理 474
18.5 傳送數據 475
18.5.1 傳送初始化 475
18.5.2 事件處理函式 476
18.6 結束請求 478
18.6.1 釋放請求資源 478
18.6.2 檢查引用計數結束請求 479
18.6.3 檢查狀態結束請求 480
18.6.4 綜合處理結束請求 481
18.7 總結 483
第19章 Nginx與設計模式 485
19.1 設計模式簡介 485
19.2 框架級別的模式 485
19.3 業務級別的模式 487
19.4 代碼級別的模式 488
19.5 總結 490
第20章 Nginx C++開發 491
20.1 語言簡介 491
20.2 開發準備 492
20.2.1 程式庫 492
20.2.2 頭檔案 492
20.2.3 編程範式 493
20.2.4 實現原則 493
20.2.5 源碼組織 494
20.2.6 編譯腳本 495
20.3 封裝類 497
20.3.1 基礎設施 497
20.3.2 高級數據結構 500
20.3.3 功能框架 505
20.3.4 請求處理 509
20.4 開發示例:content handler 510
20.4.1 配置信息類 510
20.4.2 業務邏輯類 511
20.4.3 模組集成類 512
20.4.4 實現源檔案 515
20.5 開發示例:filter 515
20.5.1 配置信息類 515
20.5.2 環境數據類 515
20.5.3 業務邏輯類 516
20.5.4 模組集成類 518
20.5.5 實現源檔案 519
20.6 總結 519
第21章 Nginx JavaScript開發 521
21.1 語言簡介 521
21.2 模組簡介 522
21.3 開發準備 523
21.4 指令簡介 523
21.5 功能接口 524
21.5.1 運行日誌 524
21.5.2 變數 525
21.5.3 請求處理 525
21.5.4 子請求 527
21.5.5 定時器 527
21.5.6 流處理 527
21.6 開發示例 528
21.6.1 content handler 528
21.6.2 subrequest 529
21.6.3 A/B testing 530
21.7 總結 531
第22章 Nginx Lua開發 532
22.1 語言簡介 532
22.2 模組簡介 533
22.2.1 http_lua 533
22.2.2 stream_lua 533
22.2.3 lua-resty-lib 534
22.3 開發準備 534
22.4 指令簡介 535
22.4.1 配置指令 536
22.4.2 功能指令 536
22.4.3 指令關係圖 538
22.5 套用開發流程 538
22.6 功能接口 539
22.6.1 運行日誌 539
22.6.2 時間與日期 540
22.6.3 變數 540
22.6.4 正則表達式 541
22.6.5 請求處理 542
22.6.6 請求轉發 544
22.6.7 子請求 545
22.6.8 定時器 546
22.6.9 共享記憶體 546
22.7 開發示例 547
22.7.1 content handler 548
22.7.2 filter 549
22.7.3 upstream 550
22.7.4 subrequest 550
22.7.5 discard 551
22.7.6 echo 552
22.8 總結 552
第23章 Nginx調試與測試 554
23.1 調試 554
23.1.1 調試器 554
23.1.2 調試斷點 555
23.1.3 調試日誌 556
23.2 功能測試 558
23.2.1 測試套件 559
23.2.2 測試用例 559
23.2.3 運行測試 564
23.3 性能測試 564
23.3.1 ab 565
23.3.2 http_load 565
23.3.3 wrk 566
23.3.4 Test::Nginx 567
23.4 總結 568
第24章 Nginx性能分析 569
24.1 簡介 569
24.2 火焰圖 570
24.3 分析工具 572
24.3.1 使用方式 572
24.3.2 處理數據 573
24.4 動態追蹤 576
24.4.1 CPU分析 577
24.4.2 I/O分析 579
24.4.3 Memory分析 580
24.4.4 觀測工具 581
24.5 總結 582
第25章 結束語 583
25.1 本書的遺憾 583
25.2 下一步 583
25.3 臨別贈言 584
附錄A 推薦書目 585
附錄B 字元串格式化 587
附錄C 開發輔助工具 589

相關詞條

熱門詞條

聯絡我們