Nginx 核心概念
Nginx 的基础概念和架构理解
📋 目录
Nginx 是什么
Nginx(“engine-x”)是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
主要特点
- 高性能: 采用异步事件驱动架构,可处理大量并发连接
- 低资源消耗: 内存占用少,CPU 使用率低
- 高可靠性: 稳定性强,可长期运行
- 模块化: 功能通过模块扩展,灵活可定制
- 跨平台: 支持 Linux、Unix、macOS、Windows 等
主要用途
- Web 服务器: 提供静态文件服务
- 反向代理: 转发请求到后端服务器
- 负载均衡: 分发请求到多个后端
- HTTP 缓存: 缓存后端响应
- SSL/TLS 终端: 处理 HTTPS 加密
- 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 - 其他:
select、poll
事件循环
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 代理
└── serverMain 上下文:
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; # 包含其他配置
}🎯 核心概念总结
高性能原因
- 事件驱动: 异步非阻塞 I/O
- 多路复用: epoll/kqueue 高效处理并发
- 内存池: 减少内存分配开销
- 零拷贝: sendfile 直接传输文件
- 锁优化: 无锁设计减少竞争
适用场景
- 静态文件服务
- 反向代理
- 负载均衡
- API 网关
- 缓存服务器
- SSL/TLS 终端
不适用场景
- 动态内容生成(需要配合后端)
- 复杂业务逻辑
- 需要多线程处理的任务