计算机书籍控

深入理解Nginx 模块开发与架构解析

   《深入理解Nginx:模块开发与架构解析》由阿里巴巴资深Nginx专家撰写,透彻解析Nginx架构,详解Nginx模块开发方法和技巧。

目录


前 言
第一部分 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 用HTTPproxymodule配置一个反向代理服务器/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 经典的“HelloWorld”示例/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

书籍下载

免费下载

正版书籍

深入理解Nginx 模块开发与架构解析