请求处理流程
进程结构
- 单进程
- 多进程 (默认)
- master 监控 worker
- 进程间通信使用共享内存
- cpu 与 worker 绑定
进程管理: 信号
- 红色字体需要使用 kill 发送
reload 流程
平滑升级配置:
热升级流程
- 新编译的 nginx 配置路径不要变
- cp -f
老 nginx 启动新 nginx 子进程:
优雅关闭
对 worker 而言:
- 只能对 http 优雅关闭
- 不解析 ws, udp, 所以不能优雅关闭
网络事件与 Nginx 事件的关系
网络传输
TCP
操作系统收到一个 mss 就是一个网络事件.
非阻塞
Nginx 事件驱动
事件循环:
- kernal 操作系统
epoll
优化点:
- 之所以能优化是因为, 虽然有大量并发连接, 但活跃连接占比很小
- 取活跃连接使用链表
- 事件对象管理使用红黑树
请求切换
- 提高 worker 优先级
同步&异步, 阻塞&非阻塞
阻塞&非阻塞:
- 调用系统调用是否阻塞
阻塞
- 可以设置超时
非阻塞
Nginx 模块
- 编译
- 配置
- 使用
- 变量
- ngx_module_t 描述某个模块的类别
- 模块细分
模块分类
连接池
- 配置 connections 数量
内存池
- 减少碎片
worker 间共享内存
进程间通信:
- 自旋锁
- 需要快速处理
使用共享内存的模块:
slab 内存管理
- 页
- slot
- ngx_slab_stat, tengine 提供
Nginx 容器
- 数组
- 链表
- 队列
- 哈希表
- 红黑树
- 基数树
哈希表
- 只为不变的内容服务
- cache line 对齐
- bucket size
- max size
红黑树
- 定时器
优点:
使用红黑树的模块:
动态模块
- 动态库,静态库
- 减少编译环节, 只保留调用地址
- 可以只重新编译动态模块, 而不用重新编译 nginx (微服务么, 微内核)
# 查看支持动态模块
$ ./configure --help
--withxxx_=dynamic
查看支持动态库的模块
--with...=dynamic
load_module 指令