第0章 导读 1
0.1关于本书 1
0.2读者对象 2
0.3读者要求 3
0.4运行环境 4
0.5本书的结构 4
0.6如何阅读本书 7
0.7本书的源码 8
第1章Nginx入门 9
1.1关于Nginx 9
1.1.1历史 10
1.1.2特点 10
1.1.3进程模型 11
1.1.4版本 12
1.2安装Nginx 13
1.2.1准备工作 13
1.2.2快速安装 14
1.2.3运行命令 14
1.2.4验证安装 16
1.2.5定制安装 16
1.3配置Nginx 19
1.3.1配置文件格式 19
1.3.2进程配置 20
1.3.3动态模块配置 22
1.3.4运行日志配置 22
1.3.5 events配置 23
1.3.6 http配置 23
1.3.7 server配置 25
1.3.8 location配置 26
1.3.9 fiile配置 27
1.3.10 upstream配置 27
1.3.11变量 28
1.4总结 30
第2章Nginx开发准备 31
2.1开发环境 31
2.1.1 C+++标准 31
2.1.2 Boost程序库 32
2.2目录结构 32
2.3源码特点 34
2.3.1代码风格 34
2.3.2代码优化 34
2.3.3面向对象思想 34
2.4使用C++ 35
2.4.1实现原则 35
2.4.2代码风格 36
2.4.3编译脚本 36
2.5 C++包装类 38
2.5.1类定义 38
2.5.2构造和析构 39
2.5.3成员函数 40
2.6总结 40
第3章Nginx基础设施 41
3.1头文件 41
3.1.1 Nginx头文件 41
3.1.2 C+++头文件 42
3.2整数类型 42
3.2.1标准整数类型 43
3.2.2自定义整数类型 43
3.2.3无效值 44
3.2.4 C+++封装 44
3.3错误处理 47
3.3.1错误码定义 48
3.3.2 C+++异常 48
3.4内存池 50
3.4.1结构定义 51
3.4.2操作函数 51
3.4.3 C+++封装 52
3.4.4清理机制 54
3.4.5 C+++内存分配器 57
3.5字符串 58
3.5.1结构定义 59
3.5.2操作函数 59
3.5.3 C+++封装 61
3.6时间与日期 64
3.6.1时间结构定义 64
3.6.2时间操作函数 64
3.6.3日期结构定义 65
3.6.4日期操作函数 66
3.6.5 C+++封装时间 67
3.6.6 C+++封装日期 68
3.7运行日志 70
3.7.1结构定义 71
3.7.2操作函数 71
3.7.3 C+++封装 72
3.8总结 74
第4章Nginx高级数据结构 77
4.1动态数组 77
4.1.1结构定义 77
4.1.2操作函数 79
4.1.3 C+++动态数组 79
4.2单向链表 83
4.2.1结构定义 83
4.2.2操作函数 84
4.2.3 C+++迭代器 85
4.2.4 C+++单向链表 87
4.3双端队列 90
4.3.1结构定义 90
4.3.2操作函数 91
4.3.3 C+++节点 93
4.3.4 C+++迭代器 95
4.3.5 C+++双端队列 97
4.4红黑树 101
4.4.1节点结构定义 101
4.4.2树结构定义 102
4.4.3操作函数 103
4.4.4 C+++红黑树 104
4.5缓冲区 108
4.5.1结构定义 108
4.5.2操作函数 110
4.5.3 C+++缓冲区 111
4.6数据块链 113
4.6.1结构定义 114
4.6.2操作函数 114
4.6.3 C+++节点 115
4.6.4 C+++迭代器 117
4.6.5 C+++数据块链 118
4.7键值对 120
4.7.1简单键值对 120
4.7.2散列表键值对 121
4.8总结 121
第5章Nginx开发综述 123
5.1最简单的模块 123
5.1.1模块设计 124
5.1.2配置解析 124
5.1.3处理函数 126
5.1.4模块集成 128
5.1.5编译脚本和命令 129
5.1.6测试验证 130
5.2开发基本流程 131
5.2.1设计 131
5.2.2开发 132
5.2.3编译 133
5.2.4测试验证 133
5.2.5调优 133
5.2.6流程图 133
5.3编译脚本 134
5.3.1运行机制 134
5.3.2使用的变量 135
5.3.3模块脚本 135
5.3.4两种脚本格式 136
5.3.5旧式编译脚本 136
5.4总结 137
第6章Nginx模块体系 139
6.1模块架构 139
6.1.1结构定义 139
6.1.2模块的签名 141
6.1.3模块的种类 142
6.1.4模块的函数指针表 143
6.1.5模块的类图 144
6.1.6模块的组织形式 145
6.1.7模块的初始化 147
6.1.8模块的动态加载 150
6.2配置解析 152
6.2.1结构定义 152
6.2.2配置解析的基本流程 156
6.2.3配置数据的存储模型 157
6.2.4访问配置数据 163
6.2.5确定配置数据的位置 163
6.2.6配置解析函数 165
6.2.7配置数据的合并 166
6.2.8配置指令的类型 167
6.3源码分析 168
6.3.1 ngx_core_module 168
6.3.2 ngx_errlog_ module 171
6.4 C++封装 172
6.4.1 NgxModuleConfiig 172
6.4.2 NgxModule 176
6.4.3 NgxTake 178
6.4.4 NGX MODULE NULL 180
6.5 C++开发模块 180
6.5.1模块的基本组成 180
6.5.2配置信息类 181
6.5.3业务逻辑类 183
6.5.4模块集成类 184
6.5.5实现源文件 186
6.5.6增加更多功能 187
6.6总结 187
第7章NginxHTTP框架综述 191
7.1框架简介 191
7.1.1模块分类 191
7.1.2处理流程 192
7.1.3请求结构体 194
7.1.4请求的处理阶段 195
7.1.5请求的环境数据 197
7.2处理引擎 198
7.2.1函数原型 198
7.2.2处理函数的存储方式 198
7.2.3内容处理函数 199
7.2.4引擎的数据结构 200
7.2.5引擎的初始化 201
7.2.6引擎的运行机制 202
7.2.7日志阶段的处理 205
7.3过滤引擎 205
7.3.1函数原型 206
7.3.2过滤函数链表 206
7.3.3过滤函数的顺序 207
7.3.4过滤链表的运行机制 209
7.3.5请求体过滤 210
7.4源码分析 211
7.4.1 ngx_ http_static_ module 211
7.4.2 ngx_ http_not_ modifiied fiilter_module 212
7.5 C++封装 213
7.5.1 NgxModuleCtx 213
7.5.2 NgxHttpCoreModule 215
7.5.3 NgxFilter 217
7.6总结 219
第8章NginxHTTP请求处理 221
8.1状态码 221
8.2请求结构体 222
8.3请求行 223
8.3.1请求方法 223
8.3.2协议版本号 224
8.3.3资源标识符 224
8.4请求头 225
8.5请求体 226
8.5.1结构定义 226
8.5.2操作函数 227
8.6响应头 227
8.6.1结构定义 228
8.6.2操作函数 228
8.7响应体 229
8.8源码分析 229
8.8.1 ngx_ http_static_ module 230
8.8.2 ngx http_ not_ modifiied fiilter_module 231
8.9 C++封装 232
8.9.1 NgxHeaders 232
8.9.2 NgxRequestBody 235
8.9.3 NgxRequest 236
8.9.4 NgxResponse 238
8.10开发handler模块 241
8.10.1模块设计 241
8.10.2配置信息类 241
8.10.3业务逻辑类 242
8.10.4模块集成类 243
8.10.5实现源文件 245
8.10.6编译脚本 245
8.10.7测试验证 246
8.11开发fiilter模块 246
8.11.1模块设计 246
8.11.2配置信息类 246
8.11.3环境数据类 247
8.11.4业务逻辑类 248
8.11.5模块集成类 251
8.11.6实现源文件 252
8.11.7编译脚本 253
8.11.8测试验证 253
8.12总结 253
第9章NginxHTTP请求转发 255
9.1框架简介 255
9.1.1工作原理 256
9.1.2请求结构体 257
9.1.3上游结构体 258
9.1.4上游配置参数 260
9.2请求转发机制 261
9.2.1回调函数 261
9.2.2初始化 263
9.2.3设置连接参数 264
9.2.4启动连接 265
9.2.5处理数据 265
9.3负载均衡机制 266
9.3.1结构定义 267
9.3.2初始化模块入口 271
9.3.3初始化地址列表 272
9.3.4初始化算法 274
9.3.5执行算法 274
9.4源码分析 275
9.4.1 ngx_http_ memcached_ module 275
9.4.2 ngx httpv upstream_ ip_ hash_module 278
9.5 C++封装 281
9.5.1 NgxUpstream 281
9.5.2 NgxUpstreamHelper 283
9.5.3 NgxHttpUpstreamModule 285
9.5.4 NgxLoadBalance 287
9.6开发upstream模块 288
9.6.1模块设计 288
9.6.2配置信息类 288
9.6.3业务逻辑类 289
9.6.4模块集成类 292
9.6.5实现源文件 293
9.6.6编译脚本 293
9.6.7测试验证 294
9.7开发load-balance模块 294
9.7.1模块设计 294
9.7.2配置信息类 294
9.7.3业务逻辑类 295
9.7.4模块集成类 297
9.7.5实现源文件 298
9.7.6编译脚本 299
9.7.7测试验证 299
9.8总结 299
第10章NginxHTTP子请求 301
10.1子请求简介 301
10.1.1工作原理 302
10.1.2请求结构体 303
10.1.3回调函数 304
10.1.4待处理请求链表 306
10.1.5子请求存储结构 306
10.2子请求运行机制 307
10.2.1创建子请求 307
10.2.2处理引擎 311
10.2.3数据整理 312
10.3 C++封装 314
10.3.1 NgxSubRequestHandler 314
10.3.2 NgxSubRequest 316
10.4数据回传模块 317
10.4.1模块设计 317
10.4.2环境数据类 317
10.4.3业务逻辑类 319
10.4.4模块集成类 321
10.4.5编译脚本 322
10.5在模块里使用子请求 323
10.5.1模块设计 323
10.5.2配置信息类 323
10.5.3业务逻辑类 324
10.5.4测试验证 327
10.6总结 328
第11章Nginx变量 329
11.1结构定义 329
11.1.1变量值 329
11.1.2变量访问对象 330
11.1.3变量的存储 331
11.1.4请求结构体 331
11.2运行机制 332
11.2.1注册变量 333
11.2.2获取变量 333
11.2.3修改变量 334
11.3复杂变量 334
11.3.1结构定义 334
11.3.2运行机制 335
11.4 C++封装 335
11.4.1 NgxVariableValue 336
11.4.2 NgxVariable 337
11.4.3 NgxVarManager 339
11.4.4 NgxVariables 340
11.4.5 NgxComplexValue 340
11.5在模块里使用变量 341
11.5.1添加变量 341
11.5.2读写变量 343
11.6在模块里使用复杂变量 343
11.6.1配置信息类 344
11.6.2业务逻辑类 344
11.6.3模块集成类 344
11.6.4测试验证 344
11.7总结 345
第12章Nginx辅助设施 347
12.1摘要算法 347
12.1.1 MD5 347
12.1.2 SHA-1 348
12.1.3 MurmurHash 349
12.1.4 C+++封装 349
12.2编码和解码 352
12.2.1 CRC校验 352
12.2.2 Base64编码解码 353
12.2.3 URI编码解码 354
12.2.4 HTML和JSON编码 355
12.3正则表达式 356
12.4共享内存 356
12.4.1结构定义 357
12.4.2操作函数 357
12.4.3 C+++共享内存 358
12.5总结 359
第13章Nginx进程机制 361
13.1基本系统调用 361
13.1.1 errno 361
13.1.2 getrlimit 362
13.2进程系统调用 362
13.2.1 getpid 362
13.2.2 fork 363
13.2.3 waitpid 363
13.3信号系统调用 364
13.3.1 kill 364
13.3.2 sigaction 365
13.3.3 sigsuspend 365
13.4结构定义 365
13.4.1 ngx_ cycle t 365
13.4.2 ngx_core_ conf t 366
13.4.3 ngx_process t 367
13.5全局变量 368
13.5.1命令行相关 368
13.5.2操作系统相关 369
13.5.3进程功能相关 369
13.5.4信号功能相关 370
13.6启动过程 370
13.6.1基本流程 370
13.6.2解析命令行 371
13.6.3版本和帮助信息 372
13.6.4初始化cycle 372
13.6.5测试配置 374
13.6.6发送信号 374
13.6.7守护进程化 374
13.6.8启动工作进程 375
13.6.9流程图 376
13.7信号处理 377
13.7.1信号处理函数 377
13.7.2发送信号 378
13.7.3处理信号 378
13.8单进程模式 379
13.8.1 single进程 379
13.8.2 single进程流程图 381
13.9多进程模式 382
13.9.1产生子进程 382
13.9.2 master进程 383
13.9.3 master进程流程图 387
13.9.4 worker进程 388
13.9.5 worker进程流程图 389
13.10总结 390
第14章Nginx事件机制 393
14.1基本系统调用 393
14.1.1 errno 394
14.1.2 ioctl 394
14.1.3 setitimer 394
14.1.4 gettimeofday 395
14.2 socket系统调用 395
14.2.1 socket 396
14.2.2 bind 396
14.2.3 listen 396
14.2.4 accept 396
14.2.5 connect 397
14.2.6 recv 397
14.2.7 send 397
14.2.8 setsockopt 398
14.2.9 close 398
14.2.10函数关系图 398
14.3 epoll系统调用 399
14.3.1 epoll_ create 400
14.3.2 epoll_ctl 400
14.3.3 epoll_ wait 401
14.3.4 LT和ET 401
14.3.5函数关系图 402
14.4结构定义 403
14.4.1 ngx_ event t 403
14.4.2 ngx connection_ t 404
14.4.3 ngx_listening_ t 405
14.4.4 ngx_ cycle t 407
14.4.5 ngx_ os_ io_ t 408
14.4.6 ngx_event_ actions t 411
14.4.7 ngx_posted events 413
14.4.8结构关系图 415
14.5定时器 415
14.5.1红黑树 415
14.5.2操作函数 416
14.5.3超时处理 416
14.6模块体系 419
14.6.1函数指针表 419
14.6.2模块的组织形式 420
14.6.3核心配置 422
14.6.4 epoll模块 423
14.7全局变量 425
14.7.1更新时间相关 425
14.7.2事件机制相关 426
14.7.3负载均衡相关 426
14.7.4统计相关 427
14.8运行机制 427
14.8.1模块初始化 427
14.8.2进程初始化 429
14.8.3基本参数初始化 429
14.8.4 epoll初始化 430
14.8.5连接池初始化 431
14.8.6监听端口初始化 433
14.8.7初始化流程图 434
14.8.8添加事件 435
14.8.9删除事件 439
14.8.10处理事件 440
14.8.11接受连接 444
14.8.12负载均衡 447
14.8.13避免阻塞 452
14.9总结 452
第15章Nginx多线程机制 455
15.1 eventfd系统调用 455
15.2 pthread系统调用 456
15.2.1 pthread_create 456
15.2.2 pthread exit 457
15.3结构定义 457
15.3.1 ngx_thread_ task_ t 457
15.3.2 ngx_thread_pool_queue_t 458
15.3.3 ngx_thread_pool_t 458
15.3.4结构关系图 459
15.4事件通知 460
15.4.1函数接口 460
15.4.2初始化 460
15.4.3发送通知 461
15.4.4处理通知 462
15.5运行机制 463
15.5.1完成任务队列 463
15.5.2创建线程池 463
15.5.3创建任务 464
15.5.4投递任务 465
15.5.5执行任务 466
15.5.6任务完成回调 468
15.5.7销毁线程池 468
15.6在模块里使用多线程 469
15.6.1模块设计 470
15.6.2配置信息类 470
15.6.3业务逻辑类 470
15.6.4测试验证 474
15.7总结 474
第16章Nginx Stream机制 477
16.1模块体系 477
16.1.1函数指针表 477
16.1.2基础模块 478
16.1.3核心模块 480
16.1.4结构关系图 481
16.1.5存储模型 482
16.2监听端口 483
16.2.1结构定义 483
16.2.2解析配置 485
16.2.3启动监听 489
16.3处理引擎 491
16.3.1阶段定义 491
16.3.2函数原型 491
16.3.3处理函数的存储方式 492
16.3.4引擎数据结构 492
16.3.5结构关系图 493
16.3.6引擎的初始化 493
16.4过滤引擎 495
16.4.1函数原型 495
16.4.2过滤函数链表 495
16.5运行机制 496
16.5.1会话结构体 496
16.5.2创建会话 497
16.5.3执行引擎 500
16.5.4通用阶段处理 501
16.5.5预读数据 502
16.5.6产生响应数据 506
16.5.7过滤数据 506
16.5.8 结束会话 506
16.6开发stream模块 507
16.6.1 C+++封装 507
16.6.2 discard协议 508
16.6.3 time协议 510
16.6.4 chargen协议 512
16.7总结 514
第17章NginxHTTP机制 517
17.1结构定义 517
17.1.1 ngx_ http_state_e 517
17.1.2 ngx_ http_ connection_t 518
17.1.3 ngx_http_request_ t 518
17.2初始化连接 519
17.2.1建立连接 520
17.2.2等待数据 521
17.2.3读取请求头 524
17.3执行引擎 528
17.3.1初始化引擎 528
17.3.2通用阶段 530
17.3.3改写阶段 531
17.3.4访问控制阶段 532
17.3.5内容产生阶段 533
17.4处理请求体 534
17.4.1丢弃缓冲区数据 535
17.4.2读取并丢弃数据 536
17.4.3读事件处理函数 537
17.4.4启动丢弃处理 538
17.5发送数据 540
17.5.1发送初始化 540
17.5.2事件处理函数 541
17.6结束请求 543
17.6.1释放请求资源 543
17.6.2检查引用计数结束请求 544
17.6.3检查状态结束请求 545
17.6.4综合处理结束请求 546
17.7总结 548
第18章Nginx与设计模式 551
18.1设计模式简介 551
18.2框架级别的模式 551
18.3业务级别的模式 553
18.4代码级别的模式 554
18.5总结 556
第19章OpenResty开发 557
19.1简介 557
19.1.1历史 558
19.1.2版本 559
19.1.3组成 559
19.1.4性能 561
19.1.5安装 562
19.1.6目录结构 563
19.1.7命令行工具 564
19.1.8参考手册 565
19.2 Lua语言 566
19.2.1注释 566
19.2.2数据类型 567
19.2.3变量 568
19.2.4运算 569
19.2.5语句 570
19.2.6函数 572
19.2.7表 574
19.2.8标准库 575
19.2.9模块 576
19.3 LuaJIT 577
19.3.1 continue 578
19.3.2 bit 578
19.3.3 ffii 579
19.4 Lua模块 581
19.4.1指令简介 581
19.4.2配置指令 581
19.4.3功能指令 582
19.4.4指令关系图 584
19.4.5应用开发流程 584
19.5功能接口 585
19.5.1运行日志 585
19.5.2时间与日期 586
19.5.3变量 587
19.5.4正则表达式 587
19.5.5请求处理 588
19.5.6请求转发 590
19.5.7子请求 592
19.5.8 定时器 592
19.5.9共享内存 593
19.6应用实例 594
19.6.1处理请求 594
19.6.2过滤请求 595
19.6.3转发请求 596
19.6.4子请求 597
19.7 Stream Lua模块 598
19.7.1功能接口 598
19.7.2 discard 599
19.7.3 time 599
19.7.4 chargen 600
19.7.5 echo 600
19.8 lua-resty库 601
19.8.1 core 601
19.8.2 cjson 602
19.8.3 redis 603
19.9总结 603
第20章 结束语 605
20.1本书的遗憾 605
20.2下一步 605
20.3临别赠言 606
附录A推荐书目 607
附录B GDB调试简介 609
附录C Nginx C++模块简介 611
附录D Nginx的字符串格式化 613
附录E nginScript简介 615