Nginx 核心概念
一句话定义:
Nginx 是一个 基于事件驱动、异步非阻塞 I/O 的多进程网络服务器与反向代理平台。
它既是:
- Web Server(静态文件)
- Reverse Proxy(反向代理)
- Load Balancer(负载均衡)
- API Gateway(网关)
- TCP/UDP Proxy(四层代理)
Master / Worker 架构
Master Process
/ | \
Worker #1 Worker #2 Worker #N
各自职责:
Master
- 读取/校验配置
- 监听端口
- fork worker
- 平滑 reload(不中断服务)
- 管理 worker 生命周期
Worker
- 真正处理请求
- 单线程
- 使用事件驱动(epoll)
- 可同时处理成千上万连接
👉 结论:
- 没有多线程锁竞争
- 没有频繁上下文切换
- 极高并发能力
1 请求 = 1 线程/进程
问题:
- 线程切换开销大
- 慢请求拖垮系统
1 worker + epoll
处理 N 个连接
- I/O 不阻塞
- 慢连接不占用 worker
- 事件触发才处理
👉 这就是 Nginx 高并发的根本原因
因为:
- 单线程 ⇒ 无锁
- 无锁 ⇒ 无竞争
- 无竞争 ⇒ CPU Cache 命中率高
多核通过 多 worker 利用,而不是多线程。
一次 HTTP 请求大致流程:
- client 建立 TCP 连接
- worker 接收连接(epoll 触发)
- 读取请求头
- 解析 HTTP 协议
- 匹配 server
- 匹配 location
- 选择模块(static / proxy / fastcgi)
- 处理或转发请求
- 写回响应
- 记录日志
- 连接复用 / 关闭
worker_processes auto;
-> 控制 worker 数量
use epoll;
worker_connections 65535;
-> 决定最大并发能力
最大连接 ≈ worker_processes × worker_connections
http {
server { ... }
}
-> 定义 HTTP 协议层的行为
server {
listen 80;
server_name example.com;
}
-> 类似 Apache 的 VirtualHost
location /api/ {
}
-> Nginx 最强大的地方 -> 通过 URI 路由请求
优先级从高到低:
- = 精确匹配
- ^~ 前缀匹配(终止正则)
- ~ / ~* 正则匹配
- 普通前缀匹配
- / 默认兜底
Nginx 是 模块驱动 的:
- 核心模块(core)
- HTTP 模块
- Stream 模块
- Mail 模块
- 第三方模块
👉 请求在处理链路中被多个模块“钩子”接管
这也是:
- Lua / OpenResty 能扩展的原因
- Nginx 可定制性极强的原因
反向代理不是“转发”,而是:
Nginx 作为 请求生命周期的管理者
它负责:
- 连接管理
- 失败重试
- 超时控制
- header 重写
- gzip
- 缓存
- 日志
- 安全控制
upstream 的本质:
- 后端连接池
- 失败感知
- 调度算法
常见调度策略:
- round robin(平均)
- least_conn(最优)
- ip_hash(粘性)
- hash(一致性)
HTTP/1.1
- 一个连接顺序处理请求
- Head-of-line blocking
HTTP/2
- 多路复用
- 二进制帧
- Header 压缩
- 延迟大幅下降
👉 Nginx 作为 HTTP/2 server:
listen 443 ssl;
http2 on;
Nginx 高性能 = Nginx + OS
关键点:
- epoll
- 文件描述符限制(ulimit -n)
- TCP backlog
- TIME_WAIT 回收
- sendfile 零拷贝
因为:
- master fork 新 worker
- 新 worker 接管新连接
- 老 worker 处理完现有连接后退出
👉 优雅重启(graceful reload)
| 对比 | Nginx | Apache |
|---|---|---|
| 并发模型 | 事件驱动 | 多进程/线程 |
| 内存 | 极低 | 高 |
| 静态资源 | 极强 | 一般 |
| 高并发 | 天生优势 | 易崩 |
| 动态内容 | 代理 | 内嵌模块 |
Nginx 的核心设计哲学:
- 把复杂留给后端
- 自己只做“高效的流量调度器”
- 用最少的资源处理最多的连接