眉清目秀 棱角分明 印象中就是一种夸张的修饰手法,后来才发现是平铺直叙 毫无修饰
Nginx 完整架构及启动流程图
一、Nginx 整体架构(最核心)
一句话架构
1 个 Master(管理) + 多个 Worker(工作) + 异步非阻塞事件驱动
┌─────────────────────────────────────────────────┐
│ Nginx Master 进程 │
│ (管理进程:读配置、管理Worker、热重载、平滑重启) │
└───────────┬───────────────┬──────────────┬───────┘
│ │ │
┌───────────▼─┐ ┌─────────▼──┐ ┌──────▼──────┐
│ Worker 1 │ │ Worker 2 │ │ Worker N │
│ (工作进程) │ │ (工作进程) │ │ (工作进程) │
└─────────────┘ └────────────┘ └──────────────┘
↓ ↓ ↓
┌─────────────────────────────────────────────────┐
│ 事件模块(epoll/kqueue/select) │
└─────────────────────────────────────────────────┘
↓ ↓ ↓
┌─────────────┐ ┌────────────┐ ┌───────────────┐
│ HTTP模块 │ │ 代理模块 │ │ 负载均衡模块 │
└─────────────┘ └────────────┘ └───────────────┘
架构特点(必懂)
- Master 不处理请求,只管理
- Worker 真正处理连接、请求
- Worker 数量 = CPU 核心数(最佳)
- 异步非阻塞 + 多路复用(epoll) → 高并发
- 请求之间互不影响
二、Nginx 启动流程步骤
开始
↓
执行 nginx 或 systemctl start nginx
↓
1. 解析命令行参数(-c / -t / -s reload)
↓
2. 初始化 Nginx 框架(内存、日志、模块)
↓
3. 读取并解析配置文件(nginx.conf + conf.d/*.conf)
↓
4. 检查配置合法性(nginx -t 做的就是这步)
↓
5. 创建 Master 进程
↓
6. Master 绑定监听端口(80/443)
↓
7. Master fork() 创建 N 个 Worker 进程
↓
8. Worker 继承 socket 文件描述符
↓
9. Worker 启动事件循环(epoll),开始 accept 连接
↓
10. 接收请求 → 处理(静态/代理/rewrite/负载均衡)
↓
11. 返回响应 → 关闭连接(keepalive 则复用)
↓
持续运行,直到 Master 收到退出信号
graph TD
A["开始"] --> B["执行 nginx 或 systemctl start nginx"]
B --> C["1. 解析命令行参数<br/>(-c / -t / -s reload)"]
C --> D["2. 初始化 Nginx 框架<br/>(内存、日志、模块)"]
D --> E["3. 读取并解析配置文件<br/>(nginx.conf + conf.d/*.conf)"]
E --> F["4. 检查配置合法性<br/>(nginx -t 做的就是这步)"]
F --> G["5. 创建 Master 进程"]
G --> H["6. Master 绑定监听端口<br/>(80/443)"]
H --> I["7. Master fork() 创建 N 个 Worker 进程"]
I --> J["8. Worker 继承 socket 文件描述符"]
J --> K["9. Worker 启动事件循环(epoll),开始 accept 连接"]
K --> L["10. 接收请求 → 处理<br/>(静态/代理/rewrite/负载均衡)"]
L --> M["11. 返回响应 → 关闭连接<br/>(keepalive 则复用)"]
M --> N["持续运行,直到 Master 收到退出信号"]
三、启动流程白话
- 启动命令
nginx 或 systemctl start nginx
- 初始化环境
内存池、日志、模块加载。
- 读配置
/etc/nginx/nginx.conf + /etc/nginx/conf.d/*.conf
- 配置检查
语法、端口冲突、目录是否存在。
- Master 启动
管理员进程,不处理请求。
- 绑定端口 80/443
只有 Master 能绑定特权端口。
- fork 出多个 Worker
Worker 数量 = worker_processes auto;(默认 CPU 核心数)
- Worker 抢占 accept
惊群问题由 Nginx 锁机制解决。
- 事件循环 epoll
异步非阻塞,支持 10 万 + 连接。
- 处理请求
HTTP 解析 → 路由匹配 (location) → 静态 / 代理 /rewrite → 响应返回。
四、Nginx 请求处理流程图(最常用)
客户端请求 → 三次握手
↓
Worker 进程 accept() 连接
↓
读取请求数据(异步非阻塞)
↓
解析 HTTP 请求行、头、体
↓
匹配 server_name
↓
匹配 location 规则
↓
执行 rewrite / 权限 / 限流 / 缓存
↓
─── 静态文件 ─── ─── 反向代理 ───
读磁盘文件 转发到后端服务器
↓ ↓
返回响应 接收后端响应
↓ ↓
───────────────┴────────────────
↓
发送响应给客户端
↓
keepalive 或 关闭连接
五、Master & Worker 职责(最关键)
Master
- 读配置
- 管理 Worker
- 热重启、热重载(reload)
- 平滑升级
- 绑定端口
Worker
- 接收连接
- 处理请求
- 静态文件
- 反向代理
- 负载均衡
- 响应输出
六、一张图记住 Nginx 架构
┌─────────────┐
│ Master │ 管理
└──────┬──────┘
│
┌──────┼──────┐
│ │ │
▼ ▼ ▼
┌───┐ ┌───┐ ┌───┐
│W1│ │W2│ │W3│ 工作进程
└───┘ └───┘ └───┘