强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 │ │  │
│  内存开销大           │              │  │  └──┘└──┘└──┘ │  │
│  并发受限             │              │  │  一个线程处理   │  │
└─────────────────────┘              │  │  数千连接       │  │
                                      │  └───────────────┘  │
                                      └─────────────────────┘
维度ApacheNginx
并发模型进程/线程 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 SourceNginx Plus(商业)
反向代理
负载均衡✅(基础)✅(高级:会话保持、动态上游)
HTTP/2
动态模块✅(部分)✅(全部)
主动健康检查❌(仅被动)
API 网关功能
仪表盘
技术支持社区官方
价格免费~$2500/年/实例

生产环境中,开源版 + Prometheus + Grafana 可以替代大部分 Nginx Plus 功能。

Nginx vs 其他现代服务器

服务器语言特点适用场景
NginxC高性能,生态最大通用,生产首选
CaddyGo自动 HTTPS,配置极简中小项目,快速部署
TraefikGo原生容器支持,自动发现Docker/K8s 环境
EnvoyC++Service Mesh 原生微服务 / Istio
H2OCHTTP/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 处理阶段,共享内存

下一章:安装与部署 / Installation & Deployment