nginx从零单排(二)

0 阅读2分钟

眉清目秀 棱角分明 印象中就是一种夸张的修饰手法,后来才发现是平铺直叙 毫无修饰

image.png

Nginx 完整架构及启动流程图


一、Nginx 整体架构(最核心)

一句话架构

1 个 Master(管理) + 多个 Worker(工作) + 异步非阻塞事件驱动

┌─────────────────────────────────────────────────┐
│               Nginx Master 进程                  │
│  (管理进程:读配置、管理Worker、热重载、平滑重启) │
└───────────┬───────────────┬──────────────┬───────┘
            │               │              │
┌───────────▼─┐   ┌─────────▼──┐   ┌──────▼──────┐
│ Worker 1    │   │ Worker 2   │   │ Worker N     │
│ (工作进程)   │   │ (工作进程) │   │ (工作进程)   │
└─────────────┘   └────────────┘   └──────────────┘
      ↓                ↓               ↓
┌─────────────────────────────────────────────────┐
│          事件模块(epoll/kqueue/select)          │
└─────────────────────────────────────────────────┘
      ↓                ↓               ↓
┌─────────────┐  ┌────────────┐  ┌───────────────┐
│ HTTP模块    │  │ 代理模块   │  │ 负载均衡模块  │
└─────────────┘  └────────────┘  └───────────────┘

架构特点(必懂)

  1. Master 不处理请求,只管理
  1. Worker 真正处理连接、请求
  1. Worker 数量 = CPU 核心数(最佳)
  1. 异步非阻塞 + 多路复用(epoll) → 高并发
  1. 请求之间互不影响

二、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 收到退出信号"]

三、启动流程白话

  1. 启动命令

nginx 或 systemctl start nginx

  1. 初始化环境

内存池、日志、模块加载。

  1. 读配置

/etc/nginx/nginx.conf + /etc/nginx/conf.d/*.conf

  1. 配置检查

语法、端口冲突、目录是否存在。

  1. Master 启动

管理员进程,不处理请求。

  1. 绑定端口 80/443

只有 Master 能绑定特权端口。

  1. fork 出多个 Worker

Worker 数量 = worker_processes auto;(默认 CPU 核心数)

  1. Worker 抢占 accept

惊群问题由 Nginx 锁机制解决。

  1. 事件循环 epoll

异步非阻塞,支持 10 万 + 连接。

  1. 处理请求

HTTP 解析 → 路由匹配 (location) → 静态 / 代理 /rewrite → 响应返回。


四、Nginx 请求处理流程图(最常用)

客户端请求 → 三次握手
  ↓
Worker 进程 accept() 连接
  ↓
读取请求数据(异步非阻塞)
  ↓
解析 HTTP 请求行、头、体
  ↓
匹配 server_name
  ↓
匹配 location 规则
  ↓
执行 rewrite / 权限 / 限流 / 缓存
  ↓
─── 静态文件 ───      ─── 反向代理 ───
读磁盘文件            转发到后端服务器
  ↓                      ↓
返回响应              接收后端响应
  ↓                      ↓
───────────────┴────────────────
               ↓
发送响应给客户端
  ↓
keepalive 或 关闭连接

五、Master & Worker 职责(最关键)

Master

  • 读配置
  • 管理 Worker
  • 热重启、热重载(reload)
  • 平滑升级
  • 绑定端口

Worker

  • 接收连接
  • 处理请求
  • 静态文件
  • 反向代理
  • 负载均衡
  • 响应输出

六、一张图记住 Nginx 架构

┌─────────────┐
│   Master    │  管理
└──────┬──────┘
       │
┌──────┼──────┐
│      │      │
▼      ▼      ▼
┌───┐ ┌───┐ ┌───┐
│W1│ │W2│ │W3│  工作进程
└───┘ └───┘ └───┘