第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入门 9
1.1 关于Nginx 9
1.1.1 历史 10
1.1.2 特点 10
1.1.3 进程模型 11
1.1.4 版本 13
1.2 安装Nginx 13
1.2.1 准备工作 14
1.2.2 快速安装 14
1.2.3 运行命令 15
1.2.4 验证安装 16
1.2.5 定制安装 17
1.3 配置Nginx 19
1.3.1 语法格式 20
1.3.2 进程管理 21
1.3.3 动态模块 23
1.3.4 运行日志 23
1.3.5 事件机制 23
1.4 HTTP服务 24
1.4.1 基本配置 25
1.4.2 server配置 26
1.4.3 location配置 26
1.4.4 file配置 28
1.5 TCP/UDP服务 28
1.6 反向代理 29
1.6.1 上游集群 29
1.6.2 负载均衡 30
1.6.3 代理转发 31
1.7 变量 31
1.8 总结 33
第2章 Nginx开发准备 35
2.1 源码结构 35
2.2 源码特点 36
2.2.1 代码风格 36
2.2.2 代码优化 37
2.2.3 面向对象思想 37
2.3 头文件 38
2.4 总结 38
第3章 Nginx基础设施 39
3.1 常数 39
3.1.1 环境信息 39
3.1.2 版本信息 40
3.1.3 错误码 40
3.2 整数类型 41
3.2.1 标准整数类型 41
3.2.2 自用整数类型 42
3.2.3 无效值 42
3.3 内存池 44
3.3.1 结构定义 44
3.3.2 操作函数 45
3.3.3 用法示例 46
3.4 字符串 46
3.4.1 结构定义 46
3.4.2 操作函数 47
3.4.3 用法示例 50
3.5 时间 51
3.5.1 结构定义 51
3.5.2 操作函数 51
3.5.3 用法示例 52
3.6 日期 52
3.6.1 结构定义 52
3.6.2 操作函数 53
3.6.3 用法示例 54
3.7 运行日志 54
3.7.1 结构定义 54
3.7.2 操作函数 55
3.7.3 用法示例 56
3.8 摘要算法 56
3.8.1 Times33 57
3.8.2 CRC 57
3.8.3 MurmurHash 58
3.8.4 MD5 59
3.8.5 SHA-1 59
3.9 数据编码 60
3.9.1 Base64 60
3.9.2 HTML/JSON 61
3.10 总结 62
第4章 Nginx高级数据结构 63
4.1 动态数组 63
4.1.1 结构定义 64
4.1.2 操作函数 65
4.1.3 用法示例 66
4.2 单向链表 67
4.2.1 结构定义 67
4.2.2 操作函数 68
4.2.3 用法示例 68
4.3 双端队列 70
4.3.1 结构定义 70
4.3.2 操作函数 71
4.3.3 用法示例 73
4.4 红黑树 74
4.4.1 结构定义 75
4.4.2 操作函数 77
4.4.3 用法示例 78
4.5 缓冲区 80
4.5.1 结构定义 80
4.5.2 操作函数 82
4.5.3 用法示例 83
4.6 数据块链 84
4.6.1 结构定义 84
4.6.2 操作函数 85
4.6.3 用法示例 85
4.7 总结 86
第5章 Nginx开发概述 87
5.1 开发示例 87
5.1.1 模块设计 87
5.1.2 配置解析 88
5.1.3 处理函数 90
5.1.4 模块集成 92
5.1.5 编译脚本 93
5.1.6 测试验证 94
5.2 开发流程 94
5.2.1 设计 95
5.2.2 开发 95
5.2.3 编译 96
5.2.4 测试验证 96
5.2.5 调优 96
5.2.6 流程图 97
5.3 编译脚本 97
5.3.1 运行机制 98
5.3.2 脚本变量 98
5.3.3 添加模块 99
5.3.4 脚本格式 99
5.3.5 旧式脚本 100
5.4 总结 101
第6章 Nginx模块体系 103
6.1 模块架构 103
6.1.1 结构定义 103
6.1.2 模块的签名 105
6.1.3 模块的种类 106
6.1.4 模块的函数指针表 107
6.1.5 模块的类图 108
6.1.6 模块的组织形式 109
6.1.7 模块的静态加载 111
6.1.8 模块的动态加载 113
6.2 配置解析 116
6.2.1 结构定义 116
6.2.2 基本流程 119
6.2.3 存储模型 120
6.2.4 访问配置数据 125
6.2.5 配置数据的位置 126
6.2.6 配置数据的解析 127
6.2.7 配置数据的合并 129
6.2.8 配置指令的类型 130
6.3 源码分析 131
6.3.1 ngx_core_module 131
6.3.2 ngx_errlog_module 133
6.4 总结 135
第7章 Nginx功能框架 137
7.1 框架简介 137
7.1.1 模块分类 137
7.1.2 处理流程 138
7.1.3 请求的处理阶段 140
7.1.4 请求结构体 141
7.1.5 请求的环境数据 143
7.2 处理引擎 144
7.2.1 函数原型 144
7.2.2 处理函数的存储方式 144
7.2.3 内容处理函数 145
7.2.4 引擎的数据结构 146
7.2.5 引擎的初始化 147
7.2.6 引擎的运行机制 148
7.2.7 日志阶段的处理 151
7.3 过滤引擎 151
7.3.1 函数原型 151
7.3.2 过滤函数链表 152
7.3.3 过滤函数的顺序 153
7.3.4 过滤链表的运行机制 155
7.3.5 请求体过滤 156
7.4 源码分析 156
7.4.1 ngx_http_static_module 157
7.4.2 ngx_http_not_modified_filter_module 158
7.5 总结 159
第8章 Nginx请求处理 161
8.1 状态码 161
8.2 请求结构体 162
8.3 请求行 163
8.3.1 请求方法 163
8.3.2 协议版本号 164
8.3.3 资源标识符 164
8.4 请求头 165
8.5 请求体 166
8.5.1 结构定义 166
8.5.2 操作函数 167
8.6 响应头 167
8.6.1 结构定义 167
8.6.2 操作函数 168
8.7 响应体 169
8.8 源码分析 169
8.8.1 ngx_http_static_module 169
8.8.2 ngx_http_not_modified_filter_module 171
8.9 开发示例:content handler 172
8.9.1 模块设计 172
8.9.2 配置数据 172
8.9.3 处理函数 173
8.9.4 注册函数 174
8.9.5 模块集成 175
8.9.6 编译脚本 176
8.9.7 测试验证 176
8.10 开发示例:filter 176
8.10.1 模块设计 176
8.10.2 配置数据 177
8.10.3 环境数据 177
8.10.4 注册过滤函数 178
8.10.5 过滤响应头 178
8.10.6 过滤响应体 179
8.10.7 模块集成 181
8.10.8 编译脚本 182
8.10.9 测试验证 182
8.11 总结 183
第9章 Nginx请求转发 185
9.1 框架简介 185
9.1.1 工作原理 186
9.1.2 请求结构体 187
9.1.3 上游结构体 188
9.1.4 上游配置参数 189
9.2 请求转发 190
9.2.1 回调函数 190
9.2.2 初始化 192
9.2.3 设置参数 193
9.2.4 启动连接 194
9.2.5 处理响应头 194
9.2.6 处理响应体 195
9.3 负载均衡 196
9.3.1 结构定义 196
9.3.2 初始化模块入口 200
9.3.3 初始化地址列表 201
9.3.4 初始化算法 203
9.3.5 执行算法 204
9.4 源码分析 204
9.4.1 ngx_http_memcached_module 205
9.4.2 ngx_http_upstream_ip_hash_module 207
9.5 开发示例:upstream 210
9.5.1 模块设计 210
9.5.2 配置数据 210
9.5.3 上行数据 212
9.5.4 下行数据 212
9.5.5 启动转发 213
9.5.6 注册函数 214
9.5.7 模块集成 214
9.5.8 编译脚本 215
9.5.9 测试验证 216
9.6 开发示例:balance 216
9.6.1 模块设计 216
9.6.2 配置数据 216
9.6.3 算法数据结构 217
9.6.4 模块入口 217
9.6.5 算法实现 218
9.6.6 模块集成 219
9.6.7 编译脚本 220
9.6.8 测试验证 220
9.7 总结 220
第10章 Nginx子请求 223
10.1 框架简介 223
10.1.1 工作原理 224
10.1.2 请求结构体 225
10.1.3 回调函数 226
10.1.4 待处理请求链表 228
10.1.5 子请求存储结构 228
10.2 运行机制 228
10.2.1 创建子请求 229
10.2.2 处理引擎 233
10.2.3 数据整理 234
10.3 开发示例 235
10.3.1 模块设计 236
10.3.2 配置数据 236
10.3.3 环境数据 236
10.3.4 回调函数 236
10.3.5 处理函数 237
10.3.6 注册函数 238
10.3.7 测试验证 239
10.4 总结 239
第11章 Nginx变量 241
11.1 结构定义 241
11.1.1 变量 242
11.1.2 复杂变量 243
11.1.3 变量的存储 244
11.1.4 请求结构体 244
11.2 操作变量 245
11.2.1 添加变量 245
11.2.2 获取变量 246
11.2.3 修改变量 247
11.2.4 编译复杂变量 247
11.2.5 获取复杂变量 247
11.3 开发示例:变量 248
11.3.1 模块设计 248
11.3.2 定义变量 248
11.3.3 添加变量 249
11.3.4 获取变量 249
11.3.5 测试验证 250
11.4 开发示例:复杂变量 251
11.4.1 模块设计 251
11.4.2 定义复杂变量 251
11.4.3 编译复杂变量 251
11.4.4 获取复杂变量 252
11.4.5 测试验证 252
11.5 总结 252
第12章 Nginx内存管理机制 255
12.1 基本系统调用 256
12.1.1 malloc 256
12.1.2 posix_memalign 257
12.1.3 free 257
12.2 块式内存池 258
12.2.1 结构定义 258
12.2.2 常量定义 261
12.2.3 创建内存池 261
12.2.4 分配内存 263
12.2.5 分配大块内存 264
12.2.6 分配小块内存 265
12.2.7 释放内存 270
12.2.8 清理机制 270
12.2.9 清空内存池 271
12.2.10 销毁内存池 272
12.3 页式内存池 273
12.3.1 结构定义 274
12.3.2 常量定义 276
12.3.3 初始化内存池 277
12.3.4 分配内存 279
12.3.5 分配大块内存 281
12.3.6 分配小块内存 283
12.3.7 释放内存 286
12.4 总结 288
第13章 Nginx进程机制 291
13.1 基本系统调用 291
13.1.1 errno 291
13.1.2 getrlimit 292
13.2 进程系统调用 292
13.2.1 getpid 292
13.2.2 fork 293
13.2.3 waitpid 293
13.3 信号系统调用 294
13.3.1 kill 294
13.3.2 sigaction 295
13.3.3 sigsuspend 295
13.4 结构定义 295
13.4.1 ngx_cycle_t 295
13.4.2 ngx_core_conf_t 296
13.4.3 ngx_process_t 297
13.5 全局变量 298
13.5.1 命令行相关 298
13.5.2 操作系统相关 299
13.5.3 进程功能相关 299
13.5.4 信号功能相关 300
13.6 启动过程 300
13.6.1 基本流程 300
13.6.2 解析命令行 301
13.6.3 版本和帮助信息 301
13.6.4 初始化cycle 301
13.6.5 测试配置 303
13.6.6 发送信号 304
13.6.7 守护进程化 304
13.6.8 启动工作进程 305
13.6.9 流程图 305
13.7 信号处理 306
13.7.1 信号处理函数 307
13.7.2 发送信号 307
13.7.3 处理信号 308
13.8 单进程模式 309
13.8.1 single进程 309
13.8.2 single进程流程图 311
13.9 多进程模式 311
13.9.1 产生子进程 311
13.9.2 master进程 313
13.9.3 master进程流程图 316
13.9.4 worker进程 317
13.9.5 worker进程流程图 319
13.10 总结 320
第14章 Nginx进程间通信机制 323
14.1 基本系统调用 323
14.1.1 atomic 323
14.1.2 sched_yield 324
14.1.3 semaphore 324
14.1.4 mmap 325
14.2 共享内存(Ⅰ) 325
14.2.1 结构定义 325
14.2.2 创建共享内存 325
14.2.3 使用共享内存 326
14.3 自旋锁 326
14.3.1 自旋锁定 327
14.3.2 解除锁定 328
14.3.3 使用自旋锁 328
14.4 互斥锁 328
14.4.1 结构定义 328
14.4.2 创建互斥锁 329
14.4.3 互斥锁定 330
14.4.4 解除锁定 331
14.4.5 销毁互斥锁 332
14.4.6 使用互斥锁 332
14.5 读写锁 333
14.5.1 写锁定 333
14.5.2 读锁定 333
14.5.3 解除锁定 334
14.5.4 降级锁定 334
14.5.5 使用读写锁 335
14.6 共享内存(Ⅱ) 335
14.6.1 结构定义 335
14.6.2 添加共享内存 336
14.6.3 创建共享内存 337
14.6.4 使用共享内存 338
14.7 总结 339
第15章 Nginx事件机制 341
15.1 基本系统调用 341
15.1.1 errno 342
15.1.2 ioctl 342
15.1.3 setitimer 342
15.1.4 gettimeofday 342
15.2 socket系统调用 343
15.2.1 socket 343
15.2.2 bind 343
15.2.3 listen 344
15.2.4 accept 344
15.2.5 connect 344
15.2.6 recv 344
15.2.7 send 345
15.2.8 setsockopt 345
15.2.9 close 345
15.2.10 函数关系图 346
15.3 epoll系统调用 346
15.3.1 epoll_create 347
15.3.2 epoll_ctl 347
15.3.3 epoll_wait 348
15.3.4 LT和ET 349
15.3.5 函数关系图 350
15.4 结构定义 350
15.4.1 ngx_event_t 350
15.4.2 ngx_connection_t 351
15.4.3 ngx_listening_t 353
15.4.4 ngx_cycle_t 354
15.4.5 ngx_os_io_t 355
15.4.6 ngx_event_actions_t 359
15.4.7 ngx_posted_events 361
15.4.8 关系图 362
15.5 定时器 362
15.5.1 红黑树 362
15.5.2 操作函数 363
15.5.3 超时处理 363
15.6 模块体系 366
15.6.1 函数指针表 366
15.6.2 模块的组织形式 367
15.6.3 核心配置 369
15.6.4 epoll模块 370
15.7 全局变量 371
15.7.1 更新时间相关 371
15.7.2 事件机制相关 372
15.7.3 负载均衡相关 373
15.7.4 统计相关 373
15.8 进程初始化 374
15.8.1 初始化函数 374
15.8.2 基本参数初始化 376
15.8.3 事件机制初始化 377
15.8.4 连接池初始化 378
15.8.5 监听端口初始化 379
15.8.6 初始化流程图 381
15.9 运行机制 381
15.9.1 添加事件 382
15.9.2 删除事件 385
15.9.3 处理事件 386
15.9.4 接受连接 390
15.9.5 负载均衡 392
15.10 避免阻塞 397
15.11 总结 398
第16章 Nginx多线程机制 401
16.1 eventfd系统调用 401
16.2 pthread系统调用 402
16.3 结构定义 402
16.3.1 ngx_thread_task_t 403
16.3.2 ngx_thread_pool_queue_t 403
16.3.3 ngx_thread_pool_t 404
16.3.4 结构关系图 405
16.4 事件通知 405
16.4.1 函数接口 405
16.4.2 初始化 406
16.4.3 发送通知 407
16.4.4 处理通知 407
16.5 运行机制 408
16.5.1 完成任务队列 408
16.5.2 创建线程池 408
16.5.3 创建任务 409
16.5.4 投递任务 410
16.5.5 执行任务 411
16.5.6 任务完成回调 413
16.5.7 销毁线程池 414
16.6 开发示例 415
16.6.1 模块设计 415
16.6.2 配置数据 416
16.6.3 线程任务 416
16.6.4 任务完成回调 417
16.6.5 投递任务 418
16.6.6 测试验证 419
16.7 总结 419
第17章 Nginx Stream机制 421
17.1 模块体系 421
17.1.1 函数指针表 422
17.1.2 基础模块 422
17.1.3 核心模块 424
17.1.4 结构关系图 425
17.1.5 存储模型 425
17.2 监听端口 427
17.2.1 结构定义 427
17.2.2 解析配置 429
17.2.3 启动监听 433
17.3 处理引擎 434
17.3.1 阶段定义 435
17.3.2 函数原型 435
17.3.3 处理函数的存储方式 435
17.3.4 引擎数据结构 436
17.3.5 结构关系图 437
17.3.6 引擎的初始化 437
17.4 过滤引擎 439
17.4.1 函数原型 439
17.4.2 过滤函数链表 439
17.5 运行机制 440
17.5.1 会话结构体 440
17.5.2 创建会话 441
17.5.3 执行引擎 444
17.5.4 通用阶段处理 446
17.5.5 预读数据 447
17.5.6 产生响应数据 451
17.5.7 过滤数据 451
17.5.8 结束会话 451
17.6 开发示例 452
17.6.1 discard协议 453
17.6.2 time协议 455
17.6.3 echo协议 457
17.7 总结 459
第18章 Nginx HTTP机制 461
18.1 结构定义 461
18.1.1 ngx_http_state_e 461
18.1.2 ngx_http_connection_t 462
18.1.3 ngx_http_request_t 462
18.2 初始化连接 463
18.2.1 建立连接 464
18.2.2 等待数据 465
18.2.3 读取请求头 467
18.3 执行引擎 472
18.3.1 初始化引擎 472
18.3.2 通用阶段 474
18.3.3 改写阶段 475
18.3.4 访问控制阶段 476
18.3.5 内容产生阶段 478
18.4 处理请求体 479
18.4.1 丢弃缓冲区数据 479
18.4.2 读取并丢弃数据 480
18.4.3 读事件处理函数 482
18.4.4 启动丢弃处理 483
18.5 发送数据 484
18.5.1 发送初始化 484
18.5.2 事件处理函数 485
18.6 结束请求 487
18.6.1 释放请求资源 487
18.6.2 检查引用计数结束请求 488
18.6.3 检查状态结束请求 489
18.6.4 综合处理结束请求 490
18.7 总结 492
第19章 Nginx与设计模式 495
19.1 设计模式简介 495
19.2 框架级别的模式 495
19.3 业务级别的模式 497
19.4 代码级别的模式 498
19.5 总结 500
第20章 Nginx C++开发 501
20.1 语言简介 501
20.2 开发准备 502
20.2.1 程序库 502
20.2.2 头文件 502
20.2.3 编程范式 503
20.2.4 实现原则 503
20.2.5 源码组织 504
20.2.6 编译脚本 505
20.3 封装类 507
20.3.1 基础设施 507
20.3.2 高级数据结构 510
20.3.3 功能框架 515
20.3.4 请求处理 519
20.4 开发示例:content handler 520
20.4.1 配置信息类 520
20.4.2 业务逻辑类 521
20.4.3 模块集成类 522
20.4.4 实现源文件 525
20.5 开发示例:filter 525
20.5.1 配置信息类 525
20.5.2 环境数据类 525
20.5.3 业务逻辑类 526
20.5.4 模块集成类 528
20.5.5 实现源文件 529
20.6 总结 529
第21章 Nginx JavaScript开发 531
21.1 语言简介 531
21.2 模块简介 532
21.3 开发准备 533
21.4 指令简介 533
21.5 功能接口 534
21.5.1 运行日志 534
21.5.2 变量 535
21.5.3 请求处理 535
21.5.4 子请求 537
21.5.5 定时器 537
21.5.6 流处理 537
21.6 开发示例 538
21.6.1 content handler 538
21.6.2 subrequest 539
21.6.3 A/B testing 540
21.7 总结 541
第22章 Nginx Lua开发 543
22.1 语言简介 543
22.2 模块简介 544
22.2.1 http_lua 544
22.2.2 stream_lua 544
22.2.3 lua-resty-lib 545
22.3 开发准备 545
22.4 指令简介 546
22.4.1 配置指令 547
22.4.2 功能指令 547
22.4.3 指令关系图 549
22.5 应用开发流程 549
22.6 功能接口 550
22.6.1 运行日志 550
22.6.2 时间与日期 551
22.6.3 变量 551
22.6.4 正则表达式 552
22.6.5 请求处理 553
22.6.6 请求转发 555
22.6.7 子请求 556
22.6.8 定时器 557
22.6.9 共享内存 557
22.7 开发示例 558
22.7.1 content handler 559
22.7.2 filter 560
22.7.3 upstream 561
22.7.4 subrequest 561
22.7.5 discard 562
22.7.6 echo 563
22.8 总结 563
第23章 Nginx调试与测试 565
23.1 调试 565
23.1.1 调试器 565
23.1.2 调试断点 566
23.1.3 调试日志 567
23.2 功能测试 569
23.2.1 测试套件 570
23.2.2 测试用例 570
23.2.3 运行测试 575
23.3 性能测试 575
23.3.1 ab 576
23.3.2 http_load 576
23.3.3 wrk 577
23.3.4 Test::Nginx 578
23.4 总结 579
第24章 Nginx性能分析 581
24.1 简介 581
24.2 火焰图 582
24.3 分析工具 584
24.3.1 使用方式 584
24.3.2 处理数据 585
24.4 动态追踪 588
24.4.1 CPU分析 589
24.4.2 I/O分析 591
24.4.3 Memory分析 592
24.4.4 观测工具 593
24.5 总结 594
第25章 结束语 595
25.1 本书的遗憾 595
25.2 下一步 595
25.3 临别赠言 596
附录A 推荐书目 597
附录B 字符串格式化 599
附录C 开发辅助工具 601