Nginx 核心概念

Nginx 的基础概念和架构理解


📋 目录


Nginx 是什么

Nginx(“engine-x”)是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

主要特点

  • 高性能: 采用异步事件驱动架构,可处理大量并发连接
  • 低资源消耗: 内存占用少,CPU 使用率低
  • 高可靠性: 稳定性强,可长期运行
  • 模块化: 功能通过模块扩展,灵活可定制
  • 跨平台: 支持 Linux、Unix、macOS、Windows 等

主要用途

  1. Web 服务器: 提供静态文件服务
  2. 反向代理: 转发请求到后端服务器
  3. 负载均衡: 分发请求到多个后端
  4. HTTP 缓存: 缓存后端响应
  5. SSL/TLS 终端: 处理 HTTPS 加密
  6. WebSocket 代理: 支持 WebSocket 协议

核心架构

事件驱动架构

传统服务器(Apache):
每个请求 → 创建进程/线程 → 处理请求 → 销毁进程/线程

Nginx:
主进程 → 工作进程(固定数量)→ 事件循环处理所有请求

优势:

  • 避免进程/线程创建销毁的开销
  • 内存占用稳定
  • 可处理数万甚至数十万个并发连接

Master-Worker 进程模型

┌─────────────────┐
│   Master 进程    │  # 管理进程,负责读取配置、管理工作进程
│  - 读取配置文件  │
│  - 管理工作进程  │
│  - 平滑重启      │
└────────┬────────┘
         │
    ┌────┴────┐
    ↓    ↓    ↓
┌────────┬────────┬────────┐
│ Worker │ Worker │ Worker │  # 工作进程,处理实际请求
│ 进程 1  │ 进程 2  │ 进程 3  │
│ - 事件 │ - 事件 │ - 事件 │
│ 循环   │ 循环   │ 循环   │
└────────┴────────┴────────┘

Master 进程:

  • 读取和验证配置文件
  • 创建、绑定和关闭套接字
  • 启动、终止和维护工作进程
  • 平滑重启和升级

Worker 进程:

  • 处理客户端请求
  • 接收、处理输入并输出数据
  • 与后端服务器通信
  • 每个 worker 进程是单线程的

事件驱动模型

多路复用 I/O

Nginx 使用 I/O 多路复用技术来同时处理多个连接:

  • Linux: epoll (高效处理大量并发连接)
  • FreeBSD: kqueue
  • 其他: selectpoll

事件循环

Worker 进程事件循环:

1. 等待事件 (epoll_wait)
   ↓
2. 事件发生?
   ↓是
3. 处理事件
   - 新连接 → 接受连接
   - 可读 → 读取数据
   - 可写 → 发送数据
   - 错误 → 关闭连接
   ↓
4. 处理下一个事件

异步非阻塞

同步阻塞(传统):
读取数据 → 等待数据就绪 → 处理数据 → 下一步
(整个过程阻塞)

异步非阻塞(Nginx):
发起读取 → 注册事件 → 处理其他事情 → 事件触发 → 处理数据
(不等待,继续处理其他请求)

进程模型

Master 进程

# 查看 Master 进程
ps aux | grep nginx | grep master
 
# 输出示例
root      1234  0.0  0.1  12345  2345 ?        Ss   10:00   0:00 nginx: master process /usr/sbin/nginx

特点:

  • 以 root 权限运行(需要绑定 80 端口)
  • 只有一个 master 进程
  • 负责管理 worker 进程
  • 不处理客户端请求

Worker 进程

# 查看 Worker 进程
ps aux | grep nginx | grep worker
 
# 输出示例
www-data  1235  0.0  0.2  12345  3456 ?        S    10:00   0:00 nginx: worker process
www-data  1236  0.0  0.2  12345  3456 ?        S    10:00   0:00 nginx: worker process

特点:

  • 以非特权用户运行(www-data 或 nginx)
  • 可以有多个 worker 进程
  • 实际处理客户端请求
  • 数量通常等于 CPU 核心数

配置 Worker 数量

# 在 nginx.conf 中配置
# 方式 1: 自动设置为 CPU 核心数
worker_processes auto;
 
# 方式 2: 手动指定数量
worker_processes 4;
 
# 方式 3: 根据 CPU 核心数设置
worker_processes 2;  # 双核 CPU

最佳实践:

  • 通常设置为 CPU 核心数
  • 高并发场景可以设置为 CPU 核心数的 2 倍
  • 使用 auto 自动检测

模块化设计

核心模块

核心模块(Core):
- ngx_core_module              # 核心功能
- ngx_errlog_module            # 错误日志
- ngx_conf_module              # 配置文件解析
- ngx_events_module            # 事件处理
- ngx_event_core_module        # 事件核心
- ngx_epoll_module             # epoll 支持(Linux)

HTTP 模块

HTTP 框架模块:
- ngx_http_core_module         # HTTP 核心
- ngx_http_log_module          # 访问日志
- ngx_http_upstream_module     # 负载均衡
- ngx_http_proxy_module        # 反向代理
- ngx_http_fastcgi_module      # FastCGI
- ngx_http_rewrite_module      # URL 重写
- ngx_http_access_module       # 访问控制
- ngx_http_gzip_module         # Gzip 压缩
- ngx_http_ssl_module          # SSL/TLS
- ngx_http_v2_module           # HTTP/2

邮件代理模块

- ngx_mail_core_module         # 邮件核心
- ngx_mail_pop3_module         # POP3
- ngx_mail_imap_module         # IMAP
- ngx_mail_smtp_module         # SMTP

第三方模块

常用第三方模块:
- ngx_http_substitutions_filter_module  # 内容替换
- ngx_http_concat_module                # 文件合并
- ngx_pagespeed                       # 页面优化
- ngx_http_lua_module                 # Lua 脚本支持
- ngx_http_brotli_module              # Brotli 压缩

模块分类

核心模块:

  • 编译时默认包含
  • 不可禁用
  • 提供基础功能

标准模块:

  • Nginx 官方提供
  • 编译时可选择启用/禁用
  • 提供常见功能

第三方模块:

  • 社区或个人开发
  • 需要手动编译添加
  • 扩展特殊功能

请求处理流程

HTTP 请求处理

客户端请求
    ↓
Master 进程 (接收连接)
    ↓
Worker 进程 (epoll 事件触发)
    ↓
HTTP 框架处理
    ↓
配置匹配 (server_name, location)
    ↓
模块处理链
    - rewrite 阶段
    - access 阶段
    - content 阶段
    - log 阶段
    ↓
生成响应
    ↓
发送给客户端

请求处理阶段

# Nginx HTTP 请求处理阶段
 
1. POST_READ          # 读取请求头后

2. SERVER_REWRITE     # server 级重写

3. FIND_CONFIG        # 查找 location

4. REWRITE            # location 级重写

5. POST_REWRITE       # 重写后处理

6. PREACCESS          # 访问控制前

7. ACCESS             # 访问控制

8. POST_ACCESS        # 访问控制后

9. PRECONTENT         # 内容生成前

10. CONTENT            # 内容生成

11. LOG                # 日志记录

配置上下文

# 配置上下文层级
 
main                    # 全局配置
├── events             # 事件配置
├── http               # HTTP 配置
│   ├── upstream       # 上游服务器
│   ├── server         # 虚拟主机
│   │   ├── location   # URL 匹配
│   │   └── ...
│   └── ...
├── mail               # 邮件代理
│   └── server
└── stream             # TCP/UDP 代理
    └── server

Main 上下文:

user nginx;                    # 运行用户
worker_processes auto;         # worker 进程数
error_log /var/log/nginx/error.log warn;  # 错误日志
pid /var/run/nginx.pid;        # PID 文件

Events 上下文:

events {
    worker_connections 1024;   # 每个 worker 的连接数
    use epoll;                 # 使用 epoll
    multi_accept on;           # 批量接受连接
}

Http 上下文:

http {
    include /etc/nginx/mime.types;      # MIME 类型
    default_type application/octet-stream;  # 默认类型
 
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
 
    access_log /var/log/nginx/access.log main;  # 访问日志
 
    sendfile on;                # 开启高效传输
    tcp_nopush on;              # 优化包发送
    tcp_nodelay on;             # 禁用 Nagle 算法
 
    keepalive_timeout 65;       # 长连接超时
    gzip on;                    # 开启 Gzip
 
    include /etc/nginx/conf.d/*.conf;  # 包含其他配置
}

🎯 核心概念总结

高性能原因

  1. 事件驱动: 异步非阻塞 I/O
  2. 多路复用: epoll/kqueue 高效处理并发
  3. 内存池: 减少内存分配开销
  4. 零拷贝: sendfile 直接传输文件
  5. 锁优化: 无锁设计减少竞争

适用场景

  • 静态文件服务
  • 反向代理
  • 负载均衡
  • API 网关
  • 缓存服务器
  • SSL/TLS 终端

不适用场景

  • 动态内容生成(需要配合后端)
  • 复杂业务逻辑
  • 需要多线程处理的任务

📚 相关链接


标签: nginx 架构 核心概念 事件驱动 进程模型