Nginx 介绍
Nginx官网:https://nginx.org
Nginx(发音为"engine-x")是一款高性能的开源Web服务器、反向代理服务器和负载均衡器,由俄罗斯程序员Igor Sysoev于2004年首次发布,最初是为了解决C10K问题(同时处理10,000个连接)。经过20多年的发展,Nginx已成为全球最流行的Web服务器之一,驱动了超过40%最繁忙的网站。
Nginx 的核心特点
- 高性能架构:采用事件驱动的异步非阻塞处理方式,单机能够支持几万以上的并发连接。官方监测能支持5万并发,实际操作中,很多公司为了服务器稳定会设置在20000个左右。
- 极低资源消耗:Nginx采取了分阶段资源分配技术,使得CPU与内存占用率非常低。1万个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB内存。10个Nginx进程才占用150M内存。
- 高稳定性:Nginx支持热部署,几乎可以做到7×24小时不间断运行,即使运行数月也无需重新启动。其master-worker进程分离设计保证了高可用性。
- 模块化设计:由多个不同功能、不同层次、不同类型且耦合度极低的模块组成,支持动态加载模块扩展功能。
- 丰富的应用场景:不仅可作为Web服务器,还适用于反向代理、负载均衡、邮件代理、API网关等多种场景。
- 跨平台支持:可以在大多数Unix/Linux OS上编译运行,并有Windows移植版。支持Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows等多种平台
Nginx 与 Apache 的对比
与传统Apache服务器相比,Nginx在多个方面表现出显著优势:
| 对比维度 | Apache | Nginx |
|---|---|---|
| 架构模型 | 进程/线程模型,每个连接创建一个新进程/线程 | 异步非阻塞事件驱动架构,一个工作进程处理多个连接 |
| 资源消耗 | 高内存消耗,尤其在高并发时 | 极低内存消耗,高并发时资源占用几乎不增长 |
| 静态文件处理 | 性能良好但资源占用高 | 性能卓越,资源消耗极低 |
| 动态内容处理 | 原生支持良好 | 需通过FastCGI等协议与后端交互 |
| 配置复杂度 | 配置相对复杂 | 配置文件简洁明了,易于维护 |
| 扩展性 | 通过模块扩展,但较重量级 | 轻量级模块化设计,扩展灵活 |
Nginx 的重要特性
Nginx的强大功能源自其丰富的特性集,这些特性使其成为现代Web架构中不可或缺的组件。
高性能HTTP服务器功能
作为HTTP服务器,Nginx能够高效地处理静态资源的请求,包括HTML页面、CSS样式表、JavaScript脚本、图片和视频等。其静态资源处理能力得益于:
- 高效的I/O模型:采用事件驱动的异步非阻塞I/O模型,在处理大量并发请求时保持低CPU和内存占用。
- 智能缓存机制:支持对静态资源进行缓存,减少磁盘I/O频繁访问,提高响应速度。
- sendfile系统调用:使用sendfile()系统调用实现零拷贝文件传输,大幅提升静态文件服务性能
反向代理与负载均衡
Nginx的反向代理功能是其最常用的特性之一:
- 请求转发:接收客户端请求并转发给后端服务器,对外隐藏真实服务器地址。
- 负载均衡算法:支持轮询、weight权重、ip_hash、least_conn、fair和url_hash等多种策略:
- 轮询:默认策略,按时间顺序逐一分配请求
- weight:按指定权重比例分配请求
- ip_hash:按客户端IP哈希结果固定分配服务器,解决session同步问题
- least_conn:优先分配给连接数最少的服务器
- fair:按服务器响应时间分配(第三方模块)
- url_hash:按URL哈希固定分配服务器(第三方模块)
- 健康检查:自动感知后端服务器状态,将故障节点从集群中剔除
高扩展性的模块化架构
Nginx由内核和模块组成,内核设计简洁,仅负责请求到location块的映射,具体功能由模块实现。模块分为三类:
- 核心模块:HTTP模块、EVENT模块和MAIL模块,提供基础功能。
- 基础模块:如HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块等。
- 第三方模块:如HTTP Upstream Request Hash模块、Notice模块等,用户也可开发自定义模块
Nginx 架构与性能优势
Nginx 实现原理
mermaid
flowchart TD
%% 颜色定义
classDef admin fill:#ffffff,stroke:#000000
classDef nginx fill:#ffd699,stroke:#000000
classDef master fill:#99cc99,stroke:#000000
classDef worker fill:#99cc99,stroke:#000000
classDef client fill:#ffb366,stroke:#000000
%% 节点定义
A[管理员]:::admin
M[master进程]:::master
W1[worker进程]:::worker
W2[worker进程]:::worker
C1[client]:::client
C2[client]:::client
C3[client]:::client
C4[client]:::client
%% 层级结构
subgraph Nginx架构
M -- 信号 --> W1
M -- 信号 --> W2
end
%% 连接关系
A -- signal --> M
W1 -- 连接 --> C1
W1 -- 连接 --> C2
W2 -- 连接 --> C3
W2 -- 连接 --> C4Nginx采用master-worker多进程模型,这种设计是其高性能的基础:
Master进程:管理进程,负责:
接收外界信号并作出响应
向worker进程发送信号
监控worker进程运行状态
worker异常退出时自动重启新进程
Worker进程:实际处理网络请求的进程,特点包括:
- 各worker进程独立平等,同等竞争客户端请求
- 单线程、异步非阻塞模式处理请求
- 数量通常设置为与CPU核数相同
- 每个worker可处理数千个并发连接
这种架构实现了:
- 高可靠性:worker进程相互隔离,一个崩溃不会影响其他worker
- 热部署能力:可在不中断服务的情况下升级或重载配置
- 资源隔离:各worker独立处理请求,避免资源竞争
事件驱动与异步非阻塞I/O
| 维度 | Single-Threaded(单线程异步阻塞) | Multi-threaded(多线程同步阻塞) | Asynchronous(单线程异步非阻塞) |
|---|---|---|---|
| 线程数量 | 1 | N(通常=CPU核心数) | 1 |
| 并发能力 | 无 | 线程级并发 | 任务级并发 |
| I/O处理 | 阻塞 | 阻塞但多线程弥补 | 非阻塞 |
| 资源消耗 | 极低 | 高(线程栈内存) | 低(协程/回调) |
| 调试难度 | 简单 | 困难(竞态/死锁) | 中等(回调地狱) |
| 适用场景 | 低并发简单逻辑 | CPU密集型 | I/O密集型高并发 |
事件驱动
Nginx高性能的核心在于其事件驱动的异步非阻塞处理机制:
- 事件收集器:通过epoll(Linux)、kqueue(FreeBSD)等I/O多路复用技术监控多个连接。
- 事件分发器:当事件发生时,将其分配到对应的事件处理器
- 事件处理器:执行具体I/O操作,处理请求并生成响应。
异步
与传统Apache的同步阻塞模型相比,Nginx的异步非阻塞模型优势明显:
- 高并发:单worker可同时处理数万连接,无需为每个连接创建线程/进程
- 低延迟:无上下文切换开销,响应速度更快
- 高效资源利用:无进程/线程创建销毁开销,CPU和内存占用极低
