01 - 初识 Nginx / Introduction to Nginx
初识 Nginx / Introduction to Nginx
Nginx 是什么? / What is Nginx?
Nginx(发音 “engine-x”)是一个高性能的 HTTP 和反向代理服务器,由 Igor Sysoev 于 2004 年首次发布。它以 极低的内存占用、高并发处理能力 和 事件驱动架构 著称。
Nginx (pronounced “engine-x”) is a high-performance HTTP and reverse proxy server, first released by Igor Sysoev in 2004. It is known for its extremely low memory footprint, high concurrency handling, and event-driven architecture.
它同时是:
- Web 服务器 / Web Server
- 反向代理 / Reverse Proxy
- 负载均衡器 / Load Balancer
- 邮件代理 / Mail Proxy
- HTTP 缓存 / HTTP Cache
Nginx 是全球使用最广泛的 Web 服务器之一,支撑着 Netflix、WordPress.com、Cloudflare 等巨头的基础设施。
🟢 基础 / Basics — 为什么选 Nginx? / Why Nginx?
1. 为什么 Nginx 如此流行?
对比 Apache(传统模型 vs 事件模型):
Apache (prefork 模式) Nginx (事件驱动)
┌─────────────────────┐ ┌─────────────────────┐
│ Process 1 ─► Req A │ │ │
│ Process 2 ─► Req B │ │ Worker Process │
│ Process 3 ─► Req C │ │ ┌───────────────┐ │
│ Process 4 ─► Req D │ │ │ epoll/kqueue │ │
│ ... │ │ │ ┌──┐┌──┐┌──┐ │ │
│ 每连接一个进程 │ │ │ │A ││B ││C │ │ │
│ 内存开销大 │ │ │ └──┘└──┘└──┘ │ │
│ 并发受限 │ │ │ 一个线程处理 │ │
└─────────────────────┘ │ │ 数千连接 │ │
│ └───────────────┘ │
└─────────────────────┘
| 维度 | Apache | Nginx |
|---|---|---|
| 并发模型 | 进程/线程 per 连接 | 事件驱动,非阻塞 |
| 内存消耗(10k 连接) | ~数 GB | ~数十 MB |
| 静态文件性能 | 中等 | 极高 |
| 动态内容 | 内嵌模块处理 | 需转发给后端 |
| 配置语法 | .htaccess 分散式 | 集中式 nginx.conf |
| 学习曲线 | 较平缓 | 中等 |
2. 5 分钟快速上手
安装(Ubuntu/Debian):
sudo apt update
sudo apt install -y nginx
启动:
sudo systemctl start nginx
sudo systemctl enable nginx # 开机自启
验证:
curl http://localhost
# 你会看到 Nginx 的默认欢迎页面 HTML
就这样,一个 Web 服务器已经运行起来了。
3. 最小配置文件
# /etc/nginx/nginx.conf — 最简版本
events {
worker_connections 1024; # 每个 worker 最大连接数
}
http {
server {
listen 80; # 监听端口
server_name localhost; # 域名
location / {
root /var/www/html; # 网站根目录
index index.html; # 默认首页
}
}
}
测试配置 & 重载:
sudo nginx -t # 测试配置语法
sudo nginx -s reload # 平滑重载(不断开连接)
🟡 进阶 / Intermediate — Nginx 的角色与生态 / Roles & Ecosystem
Nginx 在现代架构中的四种角色
角色 1:静态资源服务器(Static Server)
Client ──► Nginx ──► 磁盘上的 HTML/CSS/JS/图片
最简单的用法,直接从文件系统返回静态文件。
角色 2:反向代理(Reverse Proxy)
Client ──► Nginx ──► 后端应用(Node.js / Python / Go / Java)
Nginx 接收请求,转发给后端,再把响应返回客户端。客户端不知道后端的存在。
角色 3:负载均衡器(Load Balancer)
Client ──► Nginx ──┬──► App Server 1
├──► App Server 2
└──► App Server 3
在反向代理的基础上,将流量分发到多个后端实例。
角色 4:API 网关(API Gateway)
Client ──► Nginx ──┬──► /api/users ──► User Service
├──► /api/orders ──► Order Service
└──► /api/pay ──► Payment Service
根据路径、Header、方法等将请求路由到不同的微服务。
Nginx 商业版 vs 开源版
| 特性 | Nginx Open Source | Nginx Plus(商业) |
|---|---|---|
| 反向代理 | ✅ | ✅ |
| 负载均衡 | ✅(基础) | ✅(高级:会话保持、动态上游) |
| HTTP/2 | ✅ | ✅ |
| 动态模块 | ✅(部分) | ✅(全部) |
| 主动健康检查 | ❌(仅被动) | ✅ |
| API 网关功能 | ❌ | ✅ |
| 仪表盘 | ❌ | ✅ |
| 技术支持 | 社区 | 官方 |
| 价格 | 免费 | ~$2500/年/实例 |
生产环境中,开源版 + Prometheus + Grafana 可以替代大部分 Nginx Plus 功能。
Nginx vs 其他现代服务器
| 服务器 | 语言 | 特点 | 适用场景 |
|---|---|---|---|
| Nginx | C | 高性能,生态最大 | 通用,生产首选 |
| Caddy | Go | 自动 HTTPS,配置极简 | 中小项目,快速部署 |
| Traefik | Go | 原生容器支持,自动发现 | Docker/K8s 环境 |
| Envoy | C++ | Service Mesh 原生 | 微服务 / Istio |
| H2O | C | HTTP/3 优先 | 高性能 HTTP/3 |
🔴 高级 / Advanced — Nginx 内部架构 / Internal Architecture
Master-Worker 进程模型
这是理解 Nginx 一切行为的基石。
┌──────────────┐
│ Master │ ← 读取配置、管理 Worker
│ Process │ PID 1 (nginx 主进程)
└──────┬───────┘
│
┌──────────────┼──────────────┐
│ │ │
┌──────┴──────┐ ┌────┴────────┐ ┌──┴───────────┐
│ Worker 0 │ │ Worker 1 │ │ Worker 2 │
│ (epoll) │ │ (epoll) │ │ (epoll) │
│ ┌──┐┌──┐ │ │ ┌──┐┌──┐ │ │ ┌──┐┌──┐ │
│ │C1││C2│...│ │ │C3││C4│...│ │ │C5││C6│...│
│ └──┘└──┘ │ │ └──┘└──┘ │ │ └──┘└──┘ │
└─────────────┘ └─────────────┘ └──────────────┘
数千连接 数千连接 数千连接
Master 进程(root 权限运行):
- 读取并验证配置文件
- 创建、管理 Worker 进程
- 接收外部信号(reload、stop、reopen)
- 不处理任何客户端请求
Worker 进程(非特权用户运行):
- 实际处理客户端连接和请求
- 每个 Worker 是独立进程,互不通信
- 由操作系统内核通过 epoll/kqueue 事件通知
- 一个 Worker 可处理数千个并发连接
为什么是多进程而不是多线程?
- 进程隔离:一个 Worker 崩溃不影响其他 Worker
- 简化锁机制:每个进程独立,无需共享内存锁
- 稳定性:经过 20 年验证的架构
事件循环详解 / Event Loop Deep Dive
// Nginx 核心事件循环(简化伪代码)
for (;;) {
// 1. 计算超时时间
timer = ngx_event_find_timer();
// 2. 等待事件(epoll_wait / kqueue / select)
events = epoll_wait(epfd, events, max_events, timer);
// 3. 处理所有就绪事件
for (i = 0; i < events; i++) {
if (events[i].type == READ) {
ev->read_handler(ev); // 读事件处理
}
if (events[i].type == WRITE) {
ev->write_handler(ev); // 写事件处理
}
}
// 4. 处理定时器事件(超时、keepalive 等)
ngx_event_expire_timers();
// 5. 处理延迟事件队列
ngx_event_process_posted();
}
关键点:
- 非阻塞 I/O:任何操作都不会阻塞整个 Worker
- epoll(Linux)/ kqueue(macOS/BSD):O(1) 事件通知
- 惊群锁(accept_mutex):避免多个 Worker 同时 accept 导致的 CPU 唤醒风暴
请求处理的 11 个阶段 / 11 Processing Phases
Nginx 将每个 HTTP 请求的处理分为 11 个阶段,每个阶段可以挂载多个模块:
Phase 1: POST_READ ← realip 模块在此阶段运行
Phase 2: SERVER_REWRITE ← rewrite 模块(server 级别)
Phase 3: FIND_CONFIG ← 查找匹配的 location
Phase 4: REWRITE ← rewrite 模块(location 级别)
Phase 5: POST_REWRITE ← rewrite 后处理
Phase 6: PREACCESS ← limit_conn 模块
Phase 7: ACCESS ← allow/deny, auth_basic, limit_req
Phase 8: POST_ACCESS ← access 阶段后处理
Phase 9: PRECONTENT ← try_files, mirror
Phase 10: CONTENT ← 核心!实际生成响应(proxy_pass, fastcgi, static)
Phase 11: LOG ← access_log 模块
理解阶段有什么用?
# 这两行看似相似,但运行在不同阶段:
# Phase 7: ACCESS 阶段 — 如果拒绝,请求在此终止
deny 192.168.1.1;
# Phase 10: CONTENT 阶段 — 已经过了 ACCESS 阶段
return 403;
当你调试配置冲突时,理解阶段可以帮你定位问题。
共享内存区 / Shared Memory Zones
# Nginx 使用共享内存在 Worker 进程间通信
http {
# limit_req_zone:所有 Worker 共享计数器
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
# proxy_cache_path:共享缓存索引
proxy_cache_path /var/cache/nginx levels=1:2
keys_zone=my_cache:10m
max_size=1g;
}
┌─────────────┐ ┌──────────────────┐ ┌─────────────┐
│ Worker 0 │◄──►│ Shared Memory │◄──►│ Worker 1 │
│ │ │ (zone=api:10m) │ │ │
└─────────────┘ │ - 计数器 │ └─────────────┘
│ - 缓存索引 │
│ - 会话数据 │
└──────────────────┘
共享内存通过 slab 分配器管理,大小在配置时固定(如 10m),运行时不会自动扩展。
小结 / Summary
| 层级 | 你需要知道的 / What You Need to Know |
|---|---|
| 🟢 基础 | Nginx 是高性能 Web 服务器,事件驱动,安装简单 |
| 🟡 进阶 | 四种角色(静态、代理、LB、网关),开源版 vs 商业版 |
| 🔴 高级 | Master-Worker 模型,事件循环,11 处理阶段,共享内存 |