首先, nginx是个啥
→ high performance http web server → 是个 server → 但是不处理业务逻辑, 没有部署业务逻辑相关的代码 → 静态资源服务器
Note
Nginx 采用了 事件驱动 的 异步非阻塞 模型,可以同时处理大量的并发连接,能够高效地处理静态文件、动态内容和反向代理请求。
为什么是个 WEB server
- nginx 很重要的一个功能是作为 静态资源服务器 to serve static content
- 这些静态资源指的是 html, js, css
- 这些都是 web 上用的东西, 所以 nginx 是个 web server
主要功能
反向代理
- 客户端的请求到 nginx, nginx 再重新发到服务端
- nginx 作为 backend service 统一的一个入口
负载均衡
- 作为后端大量服务器的唯一入口, 把流量再根据每个服务器的 availability 分配到服务器下
安全
- 作为后端大量服务器的唯一入口, nginx 可以检测进来流量是否安全
缓存、压缩
- 客户端请求的返回结果可以缓存在 nginx 服务器上
- 注意, 这里缓存的是动态资源, 是应用服务器业务代码返回的, 不是nginx自己储存的静态文件
- 可以 gzip 压缩图片等文件
静态资源服务器
- Nginx 作为静态资源服务器, 储存 图片、视频、html、css、js 等静态文件
支持高并发请求
静态、动态资源分开部署
静态、动态资源
静态资源:
- 图片, 视频, html, js, css 等 动态资源:
- 需要走到业务逻辑的, 请求数据库、后端API等
nginx 作为静态资源服务器
这个点怎么理解?
nginx 没有业务逻辑
- 本身 nginx 不处理业务逻辑, 不处理数据库交互, 没有API请求
nginx 对静态资源的处理
- 当客户端请求静态资源的时候, nginx 直接从自己 本地 找到资源并且返回
- nginx 服务器上有 永久 储存静态资源的能力, 而不是 临时缓存
- 这些静态资源就存储在 nginx 服务器上, 不需要走到后端业务代码的逻辑 (不需要经过应用服务器处理)
Note
静态资源(如 HTML、CSS 文件)通常直接由 Nginx 来托管和提供,而不需要后端应用服务器生成并“传送”给 Nginx。
通过 CDN 进行静态资源的分发
缓存:
- 资源第一次被请求的时候, 会走到 源站; 源站上有业务逻辑, 计算之后把请求结果返回到 边缘节点, 然后缓存到边缘节点
- 这个缓存只是个缓存, 是临时的, 不是永久的
对比 nginx 对静态资源的储存
-
在静态资源本身没有变更的情况下, nginx 对静态资源的储存是永久的, 而 CDN 节点对这个静态资源的储存是临时的
-
Nginx 对静态资源的存储:
- 基本上是永久的,除非手动更改或删除
- 资源直接存储在服务器的文件系统中
- 除非重新配置或更新文件,否则资源会一直保持不变
-
CDN 节点对静态资源的存储:
- 通常是临时的,基于缓存策略
- 存储时间受多个因素影响: a. TTL (Time To Live) 设置 b. 缓存刷新策略 c. 存储空间管理策略
- 即使资源本身没有变更,CDN也可能因为其他原因清除缓存
nginx 负载均衡
什么是 负载均衡 → 七层负载和四层负载
- nginx 可以实现 四层负载均衡, 也能实现 七层负载均衡
nginx 工作原理
先学学普通的 I/O 模型: 理解下 IO 操作
进程
nginx 通过单一的主进程和多个工作进程来处理请求,每个工作进程可以处理成千上万个并发连接
一个主进程 master process:
- 负责控制整个 nginx 服务和 工作进程
- 不处理客户端的请求 多个工作进程 worker process:
- 负责处理客户端的请求
- 每个工作进程之间是相互独立的
事件驱动
Nginx 的工作进程采用事件驱动(event-driven)和异步非阻塞(asynchronous non-blocking)的方法,使用 I/O 多路复用技术(如 epoll、kqueue 等)进行高效的事件管理。
事件循环:
- 每个工作进程在启动之后就进入事件循环的队列里, 等待事件发生
- 事件: 客户端连接、I/O 完成、定时事件等 事件处理:
- 工作进程是 I/O 复用模型, 每个工作进程能够处理多个事件 (监听多个 FD)
- i.e., 一个工作进程能处理多个连接
nginx 是 事件驱动 的特点:
- 不主动轮询
- 被动接收通知
- 快速响应
Note
事件驱动可以理解为 reactor, 对事件做出相应; 而不是 proactor
I/O 复用、事件驱动、异步非阻塞
怎么理解? I/O 复用:
- 不需要为每个客户端的请求都创建新的进程, 一个进程监听多个 I/O 事件驱动:
- 每个进程监听多个 FD, FD 有事件了, 进程就会去处理
- 这里主要指的是 nginx 不会 主动 等待某个 FD 的 I/O 完成; 而是被动地监听 I/O 完成的事件 异步非阻塞:
- 针对某个 FD, 进程发起 I/O 请求之后就 move on 了, 继续干别的事
- 进程等着被内核通知
结构
单 reactor 单进程
- reactor 接收事件,
select()监听 FD - 如果是新来的客户端连接, 就发给 acceptor
- 如果不是新连接, 就丢给 handler 处理事件 注意, 上图只有一个进程, reactor、acceptor、handler 都是同一个进程里的
单 reactor 多线程

- 和 单 reactor 单进程 类似, 不过业务处理就交给其他线程了, 发挥一下 多核 CPU 的优势
