首先, 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 的优势