Nginx
Web 服务器
Apache、Lighttpd、Tomcat、Jetty、IIS 都是 Web 服务器,或者叫做 WWW(WorldWide Web) 服务器。但这些 Web 服务器在设计阶段就受到许多局限,例如当时的互联网用户规模、网络带宽、产品特点等局限,并且各自的定位与发展方向都不尽相同,使得每一款 Web 服务器的特点与应用场合都很鲜明
- Tomcat 和 Jetty 面向 Java 语言,先天就是重量级的 Web 服务器,性能与 Nginx 没有可比性
- IIS 只能在 Windows 操作系统上运行。Windows 作为服务器在稳定性与其他一些性能上都不如类 UNIX 操作系统
- Apache 发展时期很长,是重要的 Web 服务器
- Lighttpd 和 Nginx 一样,都是轻量级、高性能的 Web 服务器,欧美的业界开发者比较钟爱 Lighttpd,而国内的公司更青睐 Nginx
Apache 有许多优点,如稳定、开源、跨平台等,但它是一个重量级的、不支持高并发的 Web 服务器。在 Apache 服务器上,如果有数以万计的并发 HTTP 请求同时访问,就会导致服务器上消耗大量内存,操作系统内核对成百上千的 Apache 进程做进程间切换也会消耗大量 CPU 资源,并导致 HTTP 请求的平均响应速度降低,这些都决定 Apache 不可能成为高性能 Web 服务器
Nginx 介绍
Nginx(Engine x)是一款高性能、轻量级的 Web 服务器软件,是一款反向代理服务器,也可以作为负载均衡器、HTTP 缓存以及邮件代理服务器(IMAP/POP3/SMTP)。Nginx 的第一个公开版本 0.1.0 于 2004 年发布,以事件驱动的异步非阻塞架构著称,在高并发场景下表现优秀
由于 Nginx 使用基于事件驱动的架构能够并发处理百万级别的 TCP 连接,高度模块化的设计和自由的许可证使得扩展 Nginx 功能的第三方模块层出不穷,并带来极佳的稳定性,因此其作为 Web 服务器被广泛应用到大流量的网站上,包括腾讯、新浪、网易、淘宝等访问量巨大的网站
Nginx 的 I/O 多路复用
在传统的多线程并发中,每一个 I/O 流进入目标主机的时候,系统都会分配一个线程管理。这样一来,服务器与用户之间就一直保持着同步联系。如果服务器响应时间长,将会非常浪费资源
当用户向服务器发起请求时,服务器生成一个线程去管理,并将请求转发到数据库。数据库再从海量数据中匹配用户所需的数据,数据库匹配数据的速度相较于 Web 服务器是特别慢的。在这段时间,服务器一直与用户保持联系,这意味着线程一直在运行,一直在耗费资源,并且此时不止一位用户在访问,而有多位用户。有多少用户访问就要开启多少线程,这给服务器带来极大的压力,服务器随时都有宕机的可能。
Nginx 的最大的优势就是 I/O 多路复用。I/O 多路复用的原理是单个线程通过监控每个 I/O 流,当请求等待数据库处理时,线程又去处理其他请求;当之前的请求返回时,线程又继续处理之前的请求。这样不仅增加服务器的吞吐量,也就是在单位时间内处理了更多请求,还减少了系统资源消耗
多路复用的概念在很早之前就有人提出,也出现了相应的技术,但技术上一直存在缺陷。直到 2002 年,epoll 实现了多路复用。它修复之前的绝大部分问题,可以说是 I/O 多路复用技术的一个质的飞跃。
epoll 最大的特点就是异步、非阻塞。异步是指线程在将请求发送给数据库处理时,它不会一直等待请求返回。而它不等待请求返回就去休息或者做别的事,这就是非阻塞。
服务器端中每进来一个请求,会有一个线程去处理。但当它将请求发送给数据库时,数据库无法立即将请求返回,这就发生了阻塞。这时线程并不会一直等着,而是先去注册一个事件。一旦请求返回,就会触发之前注册的事件,系统会通知这个线程回来接着处理之前的请求,这就是异步回调。此时,如果再有请求进来,它就会接着按这种方式处理
Nginx 优点
更快
这表现在两个方面:
- 在正常情况下,单次请求会得到更快的响应
- 在高峰期(如有数以万计的并发请求),Nginx 可以比其他 Web 服务器更快地响应请求
高扩展性
Nginx 的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。当对某一个模块修复 Bug 或进行升级时,可以专注于模块自身,无须在意其他。
而且在 HTTP 模块中,还设计 HTTP 过滤器模块:一个正常的 HTTP 模块在处理完请求后,会有一串 HTTP 过滤器模块对请求的结果进行再处理。当开发一个新的 HTTP 模块时,不但可以使用诸如 HTTP 核心模块、events 模块、log 模块等不同层次或者不同类型的模块,还可以复用大量已有的 HTTP 过滤器模块。这种低耦合度的优秀设计,造就 Nginx 庞大的第三方模块
Nginx 的模块都是嵌入到二进制文件中执行的,无论官方发布的模块还是第三方模块都是如此。使得第三方模块一样具备极其优秀的性能,充分利用 Nginx 的高并发特性,因此许多高流量的网站都倾向于开发符合自己业务特性的定制模块
高可靠性
Nginx 的高可靠性来自于其核心框架代码的优秀设计、模块设计的简单性;官方提供的常用模块都非常稳定,每个 worker 进程相对独立,master 进程在 1个 worker 进程出错时可以快速“拉起”新的 worker 子进程提供服务
高并发高性能
-
一般情况下,10000 个非活跃的 HTTP Keep-Alive 连接在 Nginx 中仅消耗 2.5MB 的内存,这是 Nginx 支持高并发连接的基础
-
理论上,Nginx 支持的并发连接上限取决于内存,10万远未封顶。当然,能够及时地处理更多的并发请求,是与业务特点紧密相关
热部署
master 管理进程与 worker 工作进程的分离设计,使得 Nginx 能够提供热部署功能,即可以在 7×24 小时不间断服务的前提下,升级 Nginx 的可执行文件。同时也支持不停止服务就更新配置项、更换日志文件等功能
BSD 许可证
Nginx 应用场景
静态内容服务
这是 Nginx 最基本、最高效的场景。它能以极高的速度和极低的资源开销提供 HTML、CSS、JavaScript、图片、视频等静态文件
- 优势: 相比动态应用服务器(如 Tomcat),处理静态文件时性能高出几个数量级
- 典型配置: 在
location块中使用root或alias指令
反向代理服务器
这是 Nginx 在现代化架构中最核心、最广泛的角色。Nginx 作为客户端和后端服务器(如 Java, Python, Go, Node.js 应用)之间的中间人。
- 工作流程:
- 客户端请求
yourdomain.com - Nginx 接收请求
- Nginx 将请求转发到内部网络的一个或多个后端服务器(如
192.168.1.10:8080) - 后端服务器处理请求并返回响应给 Nginx
- Nginx 将响应返回给客户端
- 客户端请求
- 价值:
- 隐藏后端:保护后端服务器,对外只暴露 Nginx
- 灵活性:轻松更换、重启后端服务器而不影响客户端
- SSL 终端:在 Nginx 上统一处理 HTTPS 加解密,减轻后端负担
负载均衡器
当反向代理的后端服务器有多台时,Nginx 可以将流量智能地分发到它们之间,实现水平扩展和高可用
主要算法:
round-robin: 轮询(默认)。least_conn: 最少连接数。ip_hash: 基于客户端 IP 的哈希,确保同一用户总访问同一后端(会话保持)。hash: 自定义哈希键(如请求 URL、参数)。
配置示例:
upstream myapp_backend {
server backend1.example.com:8001 weight=3; # 权重为3
server backend2.example.com:8002;
server backup1.example.com:8003 backup; # 备份服务器
}
server {
location / {
proxy_pass http://myapp_backend;
}
}API 网关
Nginx 可以作为微服务或 API 的单一入口点,实现路由、聚合、认证、限流等网关功能
功能:
- 路由: 将
/users/*请求路由到用户服务,/orders/*路由到订单服务 - 认证/鉴权: 在网关层进行 JWT 验证、API Key 检查
- 限流: 使用
ngx_http_limit_req_module限制请求频率,防止攻击和过载 - 日志与监控: 集中记录访问日志和指标
内容缓存
Nginx 可以缓存来自后端服务器的响应,并将其直接返回给后续的相同请求,大幅减轻后端压力,提升响应速度
- 适用场景: 变化不频繁的动态页面、API 响应。
- 核心指令:
proxy_cache_path,proxy_cache。
核心组成
核心框架
这是 Nginx 的“引擎”,负责最基础、最关键的调度和运行
主进程: 通常以 root权限运行,负责:
- 读取、验证配置文件
- 启动和管理工作进程
- 平滑升级/重载配置(通过信号控制)
- 绑定网络端口(工作进程继承)
工作进程: 核心的“工作者”,负责处理实际的客户端连接和请求。默认数量与 CPU 核心数相等
-
采用异步、非阻塞、事件驱动模型(如
epoll,kqueue) -
每个工作进程都是单线程,但能高效处理成千上万的并发连接
-
进程间相互独立,一个崩溃不会影响其他进程,保证了高稳定性
-
缓存管理进程: 可选的进程,用于管理磁盘缓存内容的加载和过期清理
模块系统
Nginx 的所有功能都通过模块实现,这使得它高度可扩展和灵活
核心模块提供 Nginx 运行所需的最基本功能,是其他所有模块的基础:
ngx_core_module: 定义worker_processes、error_log、pid等指令ngx_events_module: 定义事件模型相关配置ngx_errlog_module: 日志系统
HTTP 模块使 Nginx 能作为 Web 服务器、反向代理和负载均衡器
标准 HTTP 模块:
ngx_http_core_module: HTTP 服务器的核心(定义server、location、listen等)ngx_http_proxy_module: 反向代理功能的核心ngx_http_upstream_module: 负载均衡功能的核心ngx_http_fastcgi_module,ngx_http_uwsgi_module,ngx_http_scgi_module: 用于代理到 FastCGI(如 PHP-FPM)、uWSGI 等应用协议ngx_http_rewrite_module: URL 重写和重定向ngx_http_headers_module: 管理 HTTP 请求和响应的头部ngx_http_gzip_module: Gzip 压缩
可选 HTTP 模块(编译时需启用):
ngx_http_ssl_module: 提供 HTTPS 支持ngx_http_realip_module: 从代理服务器(如 CDN)的头部中提取真实客户端 IPngx_http_geoip_module: 根据 IP 地址获取国家、城市等信息ngx_http_brotli_module: Brotli 压缩(比 Gzip 效率更高)
配置系统
Nginx 的配置文件采用声明式、上下文嵌套的结构,清晰易读。
指令: 配置的基本单位,以分号 ;结尾。例如 worker_processes auto;
上下文: 指令的容器,定义指令的作用范围
main: 最高层级,定义全局配置events: 配置事件驱动模型http: 包含所有 HTTP 相关配置server: 在http内,定义一个虚拟主机location: 在server内,匹配特定的 URI,是配置逻辑的核心upstream: 定义负载均衡的后端服务器组stream: 四层代理的顶级上下文
事件驱动模型
这是 Nginx 高性能的基石。它允许一个工作进程在没有请求处理时不会阻塞,而是去处理其他已就绪的请求
- 支持的机制: 根据操作系统自动选择最高效的,如
epoll(Linux)、kqueue(FreeBSD/ macOS)、IOCP(Windows)等
主要 Nginx 版本分支
Nginx 开源版 (nginx.org)
官方维护的免费开源版本,最纯净、最稳定的选择。
- 特点:核心功能完整,更新频繁,社区支持良好
- 版本管理:
主线版(Mainline)和稳定版(Stable) - 获取方式:源码编译 或 官方仓库安装
适用场景:
- 大多数标准 Web 服务场景
- 对商业许可证无限制的环境
- 需要最新功能和性能优化的场景
- 有专门运维团队可以自行编译维护
Nginx Plus (商业版)
F5 公司提供的商业支持版本,包含技术支持、额外模块和高级功能。
核心优势:
- 官方技术支持(SLA保障)
- 高级负载均衡算法(最少时间、会话持久性)
- 实时活动监控仪表板
- 配置管理 API
- 增强的安全功能(JWT 验证、动态限流)
- 高可用性功能
适用场景:
- 企业级生产环境,需要 SLA 保障
- 需要高级负载均衡和监控功能
- 预算充足,重视专业支持
- 金融服务、电商等关键业务
操作系统发行版自带版本
Linux 发行版仓库中维护的版本。
- Debian/Ubuntu:
apt install nginx - RHEL/CentOS/Rocky/AlmaLinux:
yum install nginx
特点:
- 版本通常较旧但经过充分测试
- 与操作系统深度集成
- 通过系统包管理器轻松更新
OpenResty
基于 Nginx 核心的增强平台,集成了 LuaJIT 虚拟机,可以用 Lua 脚本扩展 Nginx 功能。
核心特性:
- 完整的 Lua 编程能力
- 大量 Lua 库和模块
- 适合构建 API 网关、Web 应用防火墙
适用场景:
- 需要复杂业务逻辑的动态网关
- 实现自定义认证、限流逻辑
- 高性能 Web 应用后端
- 需要灵活编程能力的场景
Tengine
阿里巴巴基于 Nginx 开发的分支,包含许多针对高并发场景的增强功能。
特色功能:
- 动态模块加载(DSO)
- 增强的负载均衡算法
- 请求合并、动态 upstream
- 更详细的状态监控
适用场景:
- 高并发互联网业务
- 需要中文文档和社区支持
- 对特定优化功能有需求
| 使用场景 | 推荐版本 | 理由 |
|---|---|---|
| 通用 Web 服务/代理 | Nginx 开源版(官方仓库) | 稳定、社区活跃、文档完整 |
| 企业关键业务 | Nginx Plus | 技术支持、高级功能、SLA保障 |
| API 网关/复杂逻辑 | OpenResty | Lua 编程能力强大灵活 |
| 高并发互联网应用 | Tengine 或 开源版自定义编译 | 针对高并发优化 |
| 云原生/K8s 环境 | Nginx 开源版(Ingress 控制器) | 生态完善,社区支持好 |
| 简单快速部署 | 操作系统发行版自带版本 | 安装简单,稳定可靠 |