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

深入理解 Nginx
编辑推荐
书中首先通过介绍官方 Nginx 的基本用法和配置规则,帮助读者了解一般 Nginx 模块的用法,然后重点介绍了如何开发 HTTP 模块(含 HTTP 过滤模块)来得到定制化的 Nginx,其中包括开发一个功能复杂的模块所需要了解的各种知识,并对内存池的实现细节及 TCP 协议进行了详细介绍;接着,综合 Nginx 框架代码分析了 Nginx 架构的设计理念和技巧,此外,还新增了如何在模块中支持 HTTP 变量,以及与 slab 共享内存等相关的内容,相信通过完善,可进一步帮助读者更好地开发出功能丰富、性能一流的 Nginx 模块。
内容简介
本书致力于说明开发 Nginx 模块的必备知识,第 1 版发行以后,深受广大读者的喜爱。然而由于 Nginx 功能繁多且性能强大,以致必须了解的基本技能也很庞杂,而第 1 版成书匆忙,缺失了几个进阶的技巧描述,因此第 2 版在此基础上进行了完善。书中首先通过介绍官方 Nginx 的基本用法和配置规则,帮助读者了解一般 Nginx 模块的用法,然后重点介绍了如何开发 HTTP 模块(含 HTTP 过滤模块)来得到定制化的 Nginx,其中包括开发一个功能复杂的模块所需要了解的各种知识,并对内存池的实现细节及 TCP 协议进行了详细介绍;接着,综合 Nginx 框架代码分析了 Nginx 架构的设计理念和技巧,此外,还新增了如何在模块中支持 HTTP 变量,以及与 slab 共享内存等相关的内容,相信通过完善,可进一步帮助读者更好地开发出功能丰富、性能一流的 Nginx 模块。
本书包括四大部分:Nginx 能帮我做什么;如何编写一个定制的 httpmodule;深入 Nginx;实战。第一部分针对初级读者,介绍 Nginx 关于获取编译运行的基本知识。第二部分针对中级读者,以一个例子为主线,告诉读者如何开发一个 http 模块,这部分读者不需要深入了解 Nginx 的细节,只需要知道如何实现一个基本的 http 模块。第三部分针对高级读者,这是本书的重点,彻底解析 Nginx 架构,深入探讨 Nginx 各种设计的目的与意义,并对第二部分使用到的一些特性进行代码设计实现上的探索。读者读完本部分,会对整个 Nginx 架构有清晰的认识,可以编写各种模块(不局限于 http 模块)插入到 Nginx 中,从而定制自己的 Nginx。第四部分针对中高级读者,以 Tengine 的开源模块为例,帮助读者从实战角度理解第二、三部分描述的内容。
作者简介
陶辉,毕业于西安交通大学计算机科学与技术专业,曾就职于华为中央软件部、腾讯 QQ 空间、思科中国 CRDC 等公司,目前在阿里巴巴云计算公司的飞天团队工作,研究方向为介于 Iaas 和 Paas 间的弹性计算,多年以来专注于 Nginx 的定制化应用,对 Nginx 的设计与特性有深刻认识,实战经验丰富,编写过许多优秀的 Nginx 模块并应用于企业级产品中,同时撰写了大量关于 Nginx 的技术文章。擅长 Linux 下高性能服务器的开发,以及分布式环境下海量数据存储的设计开发。
目录
- 前 言
第一部分 Nginx 能帮我们做什么
第 1 章 研究 Nginx 前的准备工作 2
-
1.1 Nginx 是什么 2
-
1.2 为什么选择 Nginx 5
-
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 源码 10
-
1.4 编译安装 Nginx 11
-
1.5 conf?igure 详解 11
-
1.5.1 conf?igure 的命令参数 11
-
1.5.2 conf?igure 执行流程 18
-
1.5.3 conf?igure 生成的文件 21
-
1.6 Nginx 的命令行控制 23
-
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 优化性能的配置项 37
-
2.3.4 事件类配置项 39
-
2.4 用 HTTP 核心模块配置一个静态 Web 服务器 40
-
2.4.1 虚拟主机与请求的分发 41
-
2.4.2 文件路径的定义 45
-
2.4.3 内存及磁盘资源的分配 47
-
2.4.4 网络连接的设置 49
-
2.4.5 MIME 类型的设置 52
-
2.4.6 对客户端请求的限制 53
-
2.4.7 文件操作的优化 54
-
2.4.8 对客户端请求的特殊处理 56
-
2.4.9 ngx_http_core_module 模块提供的变量 57
-
2.5 用 HTTP proxy module 配置一个反向代理服务器 59
-
2.5.1 负载均衡的基本配置 61
-
2.5.2 反向代理的基本配置 63
-
2.6 小结 66
第二部分 如何编写 HTTP 模块
第 3 章 开发一个简单的 HTTP 模块 68
-
3.1 如何调用 HTTP 模块 68
-
3.2 准备工作 70
-
3.2.1 整型的封装 71
-
3.2.2 ngx_str_t 数据结构 71
-
3.2.3 ngx_list_t 数据结构 71
-
3.2.4 ngx_table_elt_t 数据结构 75
-
3.2.5 ngx_buf_t 数据结构 75
-
3.2.6 ngx_chain_t 数据结构 77
-
3.3 如何将自己的 HTTP 模块编译进 Nginx 77
-
3.3.1 conf?ig 文件的写法 77
-
3.3.2 利用 conf?igure 脚本将定制的模块加入到 Nginx 中 78
-
3.3.3 直接修改 Makef?ile 文件 81
-
3.4 HTTP 模块的数据结构 82
-
3.5 定义自己的 HTTP 模块 86
-
3.6 处理用户请求 89
-
3.6.1 处理方法的返回值 89
-
3.6.2 获取 URI 和参数 92
-
3.6.3 获取 HTTP 头部 94
-
3.6.4 获取 HTTP 包体 97
-
3.7 发送响应 99
-
3.7.1 发送 HTTP 头部 99
-
3.7.2 将内存中的字符串作为包体发送 101
-
3.7.3 经典的“Hello World”示例 102
-
3.8 将磁盘文件作为包体发送 103
-
3.8.1 如何发送磁盘中的文件 104
-
3.8.2 清理文件句柄 106
-
3.8.3 支持用户多线程下载和断点续传 107
-
3.9 用 C++ 语言编写 HTTP 模块 108
-
3.9.1 编译方式的修改 108
-
3.9.2 程序中的符号转换 109
-
3.10 小结 110
第 4 章 配置、error 日志和请求上下文 111
-
4.1 http 配置项的使用场景 111
-
4.2 怎样使用 http 配置 113
-
4.2.1 分配用于保存配置参数的数据结构 113
-
4.2.2 设定配置项的解析方式 115
-
4.2.3 使用 14 种预设方法解析配置项 121
-
4.2.4 自定义配置项处理方法 131
-
4.2.5 合并配置项 133
-
4.3 HTTP 配置模型 135
-
4.3.1 解析 HTTP 配置的流程 136
-
4.3.2 HTTP 配置模型的内存布局 139
-
4.3.3 如何合并配置项 142
-
4.3.4 预设配置项处理方法的工作原理 144
-
4.4 error 日志的用法 145
-
4.5 请求的上下文 149
-
4.5.1 上下文与全异步 Web 服务器的关系 149
-
4.5.2 如何使用 HTTP 上下文 151
-
4.5.3 HTTP 框架如何维护上下文结构 152
-
4.6 小结 153
第 5 章 访问第三方服务 154
-
5.1 upstream 的使用方式 155
-
5.1.1 ngx_http_upstream_t 结构体 158
-
5.1.2 设置 upstream 的限制性参数 159
-
5.1.3 设置需要访问的第三方服务器地址 160
-
5.1.4 设置回调方法 161
-
5.1.5 如何启动 upstream 机制 161
-
5.2 回调方法的执行场景 162
-
5.2.1 create_request 回调方法 162
-
5.2.2 reinit_request 回调方法 164
-
5.2.3 f?inalize_request 回调方法 165