请求处理流程

image.png

进程结构

  • 单进程
  • 多进程 (默认)

image.png

  • master 监控 worker
  • 进程间通信使用共享内存
  • cpu 与 worker 绑定

进程管理: 信号

image.png

  • 红色字体需要使用 kill 发送

reload 流程

image.png

平滑升级配置:

image.png

热升级流程

image.png

  • 新编译的 nginx 配置路径不要变
  • cp -f

老 nginx 启动新 nginx 子进程:

image.png

优雅关闭

对 worker 而言:

  • 只能对 http 优雅关闭
  • 不解析 ws, udp, 所以不能优雅关闭

image.png

网络事件与 Nginx 事件的关系

网络传输

image.png

TCP

image.png

操作系统收到一个 mss 就是一个网络事件.

非阻塞

image.png

Nginx 事件驱动

事件循环:

  • kernal 操作系统

image.png

epoll

image.png

优化点:

  • 之所以能优化是因为, 虽然有大量并发连接, 但活跃连接占比很小
  • 取活跃连接使用链表
  • 事件对象管理使用红黑树

请求切换

image.png

  • 提高 worker 优先级

同步&异步, 阻塞&非阻塞

阻塞&非阻塞:

  • 调用系统调用是否阻塞

阻塞

  • 可以设置超时

image.png

非阻塞

image.png

Nginx 模块

  1. 编译
  2. 配置
  3. 使用
  4. 变量

image.png

  • ngx_module_t 描述某个模块的类别
  • 模块细分

模块分类

image.png

连接池

  • 配置 connections 数量

image.png

内存池

  • 减少碎片

worker 间共享内存

进程间通信:

image.png

  • 自旋锁
  • 需要快速处理

使用共享内存的模块:

image.png

slab 内存管理

  • slot
  • ngx_slab_stat, tengine 提供

image.png

Nginx 容器

  • 数组
  • 链表
  • 队列
  • 哈希表
  • 红黑树
  • 基数树

哈希表

  • 只为不变的内容服务
  • cache line 对齐
  • bucket size
  • max size

红黑树

image.png

  • 定时器

优点:

image.png

使用红黑树的模块:

image.png

动态模块

  • 动态库,静态库
  • 减少编译环节, 只保留调用地址
  • 可以只重新编译动态模块, 而不用重新编译 nginx (微服务么, 微内核)
  1. # 查看支持动态模块
  2. $ ./configure --help
  3. --withxxx_=dynamic

image.png

查看支持动态库的模块

  1. --with...=dynamic

load_module 指令