《Nginx完全开发指南 使用C、C++、JavaScript和Lua》PDF下载

  • 购买积分:18 如何计算积分?
  • 作  者:罗剑锋著
  • 出 版 社:北京:电子工业出版社
  • 出版年份:2019
  • ISBN:9787121364365
  • 页数:602 页
图书介绍:Nginx是知名的Web服务器,性能优异,运行效率远超传统的Apache、Tomcat,广泛应用于国内外诸多尖端互联网公司。Nginx的一个突出特点是其灵活优秀的模块化架构,可以在不修改核心的前提下增加任意功能,自2004年发布至今,已经拥有百余个官方及非官方的功能模块(如proxy、mysql、redis、rtmp、lua等),使得Nginx成长为了一个近乎”全能”的服务器软件。Nginx功能强大,架构复杂,学习、维护和开发的门槛较高。为了帮助读者跨越这一障碍,本书深入新版Nginx源码,详细剖析了模块体系、动态插件、功能框架、进程模型、事件驱动、线程池、TCP/UDP/HTTP处理等Nginx核心运行机制,在此基础上讲解如何使用C、C++、Lua、nginScript等语言来增强扩展Nginx,让任何人都能够便捷、轻松地开发和定制Nginx,进而应用到自己的实际工作中,创造出更多的价值。

第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