当前位置: 首页 > news >正文

【新书速递】深入理解Nginx底层原理与设计,轻松应对高并发

导读:我们为什么需要学习Nginx呢?高性能,高稳定,优雅的模块化编程等就不提了,就说一个理由:Nginx是目前最受欢迎的web服务器,据统计,全球平均每3个网站,就有一个使用Nginx。如果你不懂Nginx,日常很多工作可能都无法开展。

最近看到过这么一句话:"Nginx master进程接收到客户端请求,转发给worker进程处理"。如果你不懂Nginx,就有可能也闹出类似的笑话。

当你需要搭建一套webserver时,可能基本的一些配置都一头雾水。location匹配规则你清楚吗,正则匹配、最大前缀匹配和精确匹配的顺序以及优先级你能记得住吗?反向代理proxy_pass以及fastcgi_pass你知道怎么配置吗?限流负载均衡等基本功能又怎么配置呢?一大堆配置有时真的让人头疼。

线上环境Nginx曾出现"no live upstreams"。顾名思义,Nginx认为所有上游节点都挂掉了,此时Nginx直接向客户端返回502,而不会请求上游节点。这时候你该想想,Nginx是依据什么判断上游节点都挂掉了?出现这种错误后,Nginx又是怎么恢复的呢?

线上环境高峰期Nginx还出现过这种错误:"Resource temporarily unavailable",对应的错误码是EAGAIN。非阻塞读写socket遇到EAGAIN不是通常稍等再尝试吗?其实通过源码里的一句注释就能瞬间明白了:"Linux returns EAGAIN instead of ECONNREFUSED for unix sockets if listen queue is full"。原来如此,Nginx和FPM之间是通过域套接字建立连接的,监听队列满了,系统直接返回的是EAGAIN,而不是我们平时了解的ECONNREFUSED;而Nginx在发起连接connect时,如果返回EAGAIN直接结束请求返回502。

  

这本书详解了Nginx架构、执行流程、模块实现与数据结构,剖析了Nginx源码设计精髓与应用。带你深入理解Nginx底层原理与设计,掌握高性能Web服务器开发核心,轻松应对高并发。

不同于市面上常见的Nginx应用书籍,本书从Nginx底层的多进程模型、异步非阻塞I/O、数据结构与内存管理、通信协议与机制等角度分析了Nginx的底层原理和设计思路,揭示了Nginx高并发、高性能的本质。

本书特色

内容丰富:除了Nginx相关的进程、数据结构、配置、HTTP模块、内存等内容,还附带编译脚手架和RTMP模块的详细讲解。通过学习这些内容,读者可以了解模块的构成,开发定制模块。

深入浅出:Nginx源码设计中涉及很多知识,这对入门读者来说有一定的难度。所以本书结合案例分析,让读者更轻松地理解这些庞杂、有难度的知识。

实战讲解:通过关键代码片段以及原理分析进行实战难点讲解。某些代码分析还带有源码调试分析与处理流程图,便于读者动手实战,快速入门。

主要内容

本书共12章,主要内容介绍如下。

  • 第1章介绍Nginx源码与编译安装。

  • 第2章介绍Nginx基础架构与设计理念,这两章从Nginx的优势、源码结构、进程模型等几个方面概述Nginx。

  • 第3章介绍Nginx的内存管理,从内存池、共享内存两方面介绍Nginx内存管理的相关内容。

  • 第4章介绍Nginx的基本数据结构,包括字符串、数组、链表、队列、散列、红黑树、基数树的数据结构和算法。

  • 第5章解析Nginx的配置文件,通过对main配置块、events配置块与http配置块的详细介绍,概述Nginx配置解析的全过程。

  • 第6章介绍Nginx进程机制,通过进程模式、Master进程、Worker进程以及进程间通信机制,完整介绍Nginx进程的管理。

  • 第7章介绍HTTP模块,通过服务初始化、请求解析、HTTP请求处理以及HTTP请求响应,详细介绍HTTP模块的处理过程。

  • 8章介绍Upstream机制,对Upstream初始化、上下游连接建立、长连接、FastCGI模块做了详细介绍。

  • 第9章介绍Event模块实现,内容涉及Nginx事件模型的文件事件、时间事件、进程池、连接池等事件处理流程。

  • 第10章介绍Nginx的负载均衡、限流、日志等模块的实现。

  • 第11章介绍跨平台实现,对Nginx的configure编译文件、跨平台原子操作和锁进行详细介绍。

  • 第12章介绍基于Nginx的RTMP直播服务实现。

目录

前 言

第1章 Nginx源码与编译安装 1

1.1 Nginx优势与4种应用示例 1

1.2 Nginx源码结构 4

1.3 Nginx编译安装 5

1.4 本章小结 6

第2章 Nginx基础架构与设计理念 7

2.1 Nginx进程模型 7

2.2 Nginx模块化设计 9

2.2.1 模块分类 9

2.2.2 模块接口 10

2.2.3 模块分工 12

2.3 Nginx事件驱动 13

2.4 本章小结 14

第3章 Nginx内存管理 15

3.1 Nginx内存管理简介 15

3.2 Nginx内存池 16

3.2.1 内存池结构 16

3.2.2 申请内存 17

3.2.3 释放内存 20

3.3 Nginx共享内存 22

3.3.1 共享内存的创建及销毁 22

3.3.2 互斥锁 23

3.3.3 共享内存管理 25

3.3.4 共享内存使用 30

3.4 本章小结 31

第4章 基本数据结构 32

4.1 字符串 32

4.2 数组 33

4.3 链表 35

4.4 队列 37

4.5 散列 42

4.6 红黑树 46

4.7 基数树 56

4.8 本章小结 59

第5章 配置文件解析 60

5.1 配置文件简介 60

5.2 主函数ngx_conf_parse 63

5.3 解析main配置 65

5.3.1 创建main配置上下文 65

5.3.2 解析配置指令 66

5.4 解析events配置块 69

5.5 解析http配置块 71

5.5.1 main配置解析 71

5.5.2 server配置解析 74

5.5.3 location配置解析 76

5.5.4 配置合并 79

5.5.5 location配置再处理 81

5.5.6 upstream配置解析 83

5.6 本章小结 85

第6章 Nginx进程机制 86

6.1 Nginx进程模式 86

6.1.1 daemon模式 86

6.1.2 单进程模式和多进程模式 88

6.1.3 进程模式源码解析 88

6.2 Master进程 91

6.3 Worker进程 93

6.4 进程间通信机制 99

6.4.1 信号定义 99

6.4.2 信号注册 101

6.4.3 信号处理 102

6.4.4 Master进程处理机制 106

6.4.5 Worker进程处理机制 110

6.4.6 Master进程与Worker进程通信 111

6.5 本章小结 115

第7章 HTTP模块 116

7.1 整体流程 117

7.1.1 HTTP模块初始化 117

7.1.2 HTTP请求解析 118

7.1.3 HTTP请求处理与响应 120

7.2 HTTP服务初始化 123

7.2.1 模块初始化 123

7.2.2 事件初始化 126

7.2.3 HTTP会话建立 128

7.3 HTTP请求解析 130

7.3.1 基础结构体 131

7.3.2 接收请求流程 135

7.3.3 解析请求行 137

7.3.4 解析请求头 143

7.4 HTTP请求处理 148

7.4.1 多阶段划分 148

7.4.2 11个阶段初始化 153

7.4.3 处理HTTP请求 155

7.4.4 处理请求体 169

7.5 HTTP请求响应 177

7.5.1 过滤模块 177

7.5.2 发送HTTP响应 182

7.5.3 结束HTTP响应 190

7.6 本章小结 197

第8章 Upstream机制 198

8.1 Upstream简介 198

8.2 初始化Upstream 200

8.3 与上游建立连接 205

8.4 发送请求到上游 208

8.5 处理上游响应头 210

8.6 处理上游响应体 213

8.7 结束请求 217

8.8 重试机制 219

8.9 长连接 220

8.10 FastCGI模块 225

8.10.1 FastCGI协议简介 225

8.10.2 FastCGI通信流程 226

8.10.3 Nginx FastCGI 227

8.11 本章小结 228

第9章 Event模块实现 229

9.1 基础知识及相关配置项介绍 230

9.1.1 基本概念 230

9.1.2 基本网络模型 230

9.1.3 epoll网络模型 231

9.1.4 Event模块相关配置项介绍 234

9.2 Nginx事件模型 234

9.2.1 文件事件 235

9.2.2 时间事件 235

9.2.3 进程池 237

9.2.4 监听池 237

9.2.5 连接池 238

9.2.6 事件池 240

9.2.7 Event模块初始化过程 244

9.2.8 请求处理流程 257

9.3 Nginx的惊群处理 262

9.4 Nginx的陈旧事件处理 264

9.5 本章小结 266

第10章 其他模块 267

10.1 负载均衡模块 267

10.1.1  Nginx负载均衡算法简介 267

10.1.2 Nginx负载均衡配置指令 268

10.1.3 Nginx负载均衡算法实现 270

10.2 限流模块 276

10.2.1 常见限流算法 276

10.2.2 Nginx限流配置 277

10.2.3 限流实现原理 278

10.3 日志模块 287

10.3.1 日志模块配置指令 288

10.3.2 日志模块实现原理 290

10.4 本章小结 295

第11章 跨平台实现 296

11.1 configure实现详解 296

11.2 跨平台的原子操作和锁 304

11.3 信号量 311

11.4 信号和进程管理 315

11.5 共享内存 322

11.6 本章小结 325

第12章 基于Nginx的RTMP直播服务实现 326

12.1 Nginx-RTMP简介 326

12.2 握手 328

12.3 分块 331

12.4 Nginx-RTMP模块 335

12.5 中继模块 342

12.6 本章小结 347

上下滑动查看


扫码关注【华章计算机】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 4月书讯 | 好书和最美四月天一起来了...

资讯 | DB-Engines 4月数据库排名:Redis有望甩掉“千年老七”?

书单 | 8本书助你零基础转行数据分析岗

干货 | 什么是架构?网络架构中都有什么?终于有人讲明白了

收藏 | 终于有人把Scrapy爬虫框架讲明白了

上新 | 河马书来了!线上实验领域的“圣经”火热预售中

直播 | 筑牢“数据基座” 掘金数字经济——5位大咖畅聊金融科技

活动 | Book多得的奇遇,给爱读书的你们最大的优惠力度

点击阅读全文购买

相关文章:

  • CSAPP,永远滴神!
  • 周志明:《凤凰架构:构建可靠的大型分布式系统》
  • 【第62期】学会数据分析,抢占职场风口机遇
  • 腾讯数据科学家详解用户选择行为分析核心模型
  • 【新书速递】人人可懂的深度学习
  • 开发人工智能为什么要用Python?
  • 【新书速递】首本零代码书籍问世
  • MySQL 十大常用字符串函数
  • 手把手教你用Python求最大值和最小值
  • TIOBE 7 月编程语言排行榜:C、Java 和 Python 争夺第一
  • 【新书速递】嵌入式Linux驱动领域开发的实战指南
  • 2021半年盘点,这些经典更新了!
  • ​2021半年盘点,不想你错过的重磅新书
  • 【第63期】机器人时代已来!推荐几本机器人学硬核好书
  • Netflix正在搞的混沌工程到底是什么?终于有人讲明白了
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • flask接收请求并推入栈
  • js中的正则表达式入门
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Python十分钟制作属于你自己的个性logo
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 阿里研究院入选中国企业智库系统影响力榜
  • 大型网站性能监测、分析与优化常见问题QA
  • 如何在 Tornado 中实现 Middleware
  • 微信小程序开发问题汇总
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 我们雇佣了一只大猴子...
  • ​Python 3 新特性:类型注解
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (4)(4.6) Triducer
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (四)汇编语言——简单程序
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net framework4与其client profile版本的区别
  • .NET MVC第三章、三种传值方式
  • .net对接阿里云CSB服务
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET中winform传递参数至Url并获得返回值或文件
  • .考试倒计时43天!来提分啦!
  • @EventListener注解使用说明
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @private @protected @public
  • @vue/cli脚手架
  • [].slice.call()将类数组转化为真正的数组