深入理解 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

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了