Nginx 简介
在动手装环境之前,我们先搞清楚三个问题:Nginx 是什么、它是怎么诞生的、为什么它能把 Apache 按在地上摩擦了十几年。理解了背景,后面学配置的时候才不会一头雾水。
Nginx 是什么?
Nginx(发音同 "Engine-X")是一款开源的高性能 Web 服务器,同时也能做反向代理、负载均衡、邮件代理、HTTP 缓存。它由 C 语言编写,2004 年首次发布,目前(2024 年)是全网最流行的 Web 服务器——根据 W3Techs 的统计,全球所有网站里有超过 34% 在用 Nginx,比 Apache 还高。
一句话总结它的价值:把流量廉价、稳定、快速地分发给后端应用。无论你用的是 Node.js、Python Flask、Java Spring Boot 还是 PHP,生产环境几乎都会在前面挡一层 Nginx。
诞生故事:俄罗斯程序员的"业余作品"
Nginx 的作者叫 Igor Sysoev(伊戈尔·赛索耶夫),一位俄罗斯工程师。故事的关键节点:
- 2002 年:当时 Igor 在俄罗斯最大的门户网站 Rambler 工作。Rambler 每天要承载巨大的并发,C10K 问题(一台服务器如何同时处理一万个连接)困扰着所有运维。Apache 1.x 用每连接一个进程/线程的模型,一万个连接就开一万个线程,内存和上下文切换开销爆炸。Igor 决定自己写一个。
- 2004 年 10 月:Nginx 第一个公开版本 0.1.0 发布,采用 BSD 许可证开源。
- 2011 年:Igor 创立 Nginx Inc. 公司,开始提供商业支持。
- 2013 年:推出 Plus 商业版(付费功能、企业支持)。
- 2019 年:F5 Networks 以 6.7 亿美元收购 Nginx 公司。Igor 在 2022 年从 F5 离职。
- 今天:Nginx 开源版仍然活跃,社区版未来由 nginxfork 等社区分支继续推动(部分用户对 F5 商业化方向不满而分叉)。
一个人写的"业余作品"影响了整个互联网二十年——这是 Nginx 最传奇的地方。
为什么 Nginx 这么快?
答案可以用一句话概括:事件驱动 + 异步非阻塞 + 多路复用。但这句话不解释清楚等于没说,我们拆开看:
1. Apache 的模型:每连接一个线程
Apache 传统的 Prefork/Worker 模式,每来一个连接就分配一个线程去处理。线程是操作系统级别的资源——每个线程默认要占几 MB 内存,1 万个连接就是几十 GB 内存,再加上线程切换的 CPU 开销,机器很快就扛不住。
2. Nginx 的模型:一个 worker 跑一个事件循环
Nginx 的 worker 进程用 epoll(Linux)或 kqueue(Mac/BSD)系统调用,一个 worker 可以同时管理数千个连接。它的工作方式是:
- 把所有连接的文件描述符扔给内核;
- 当某个连接有数据可读/可写时,内核主动通知 worker;
- worker 处理完这个事件后立刻去处理下一个,绝不阻塞等待。
打个比方:Apache 是给每个客人配一个服务员,客人发呆服务员也跟着等;Nginx 是一个服务员同时盯 1000 桌,谁举手就过去处理一下,处理完马上回来。同样的硬件,Nginx 能承载的并发是 Apache 的 10~100 倍。
3. 进程模型:master + worker
Nginx 启动后是这样的结构:
# Nginx 的进程模型:1 个 master + N 个 worker
# 用 ps 命令可以清楚看到这种结构
ps -ef | grep nginx
# 输出大致如下:
# root 1234 1 0 10:00 ? 00:00:00 nginx: master process /usr/sbin/nginx
# www-data 1235 1234 0 10:00 ? 00:00:00 nginx: worker process
# www-data 1236 1234 0 10:00 ? 00:00:00 nginx: worker process
# www-data 1237 1234 0 10:00 ? 00:00:00 nginx: worker process
# www-data 1238 1234 0 10:00 ? 00:00:00 nginx: worker process
# master 负责:读配置、绑定端口、fork 出 worker
# worker 负责:真正的请求处理,每个 worker 能扛数千连接这种设计的妙处:worker 挂了 master 会立刻重启一个,对外完全无感;配置改了只需 reload,master 会平滑地让老 worker 处理完现有连接再退出,新 worker 接管新连接——零停机部署就是靠这个。
Nginx vs Apache:核心差异
| 维度 | Nginx | Apache |
|---|---|---|
| 并发模型 | 事件驱动、异步非阻塞 | 每连接一个线程(Prefork/Worker) |
| 万级并发 | 单机轻松数万连接 | 通常千级就吃力 |
| 内存占用 | 极低(worker 数固定) | 随连接数线性增长 |
| 静态文件 | 极快(sendfile 零拷贝) | 略慢 |
| 动态内容 | 需反向代理到后端 | 可内嵌 PHP/Python 模块 |
| 配置风格 | 指令式、嵌套块 | 指令式、.htaccess 分布式 |
| 典型场景 | 反向代理、负载均衡、静态资源 | 传统 LAMP、共享主机 |
注意:Apache 不是不好,它在 2.4 之后也引入了 Event MPM(事件模型),但生态惯性已经形成——云原生时代 Nginx 是事实标准。
Nginx 都用在哪?典型应用场景
- 静态资源服务:图片、CSS、JS、视频,CDN 源站几乎都是 Nginx。
- 反向代理:在 Node.js/Python/Java/Go 应用前挡一层,处理 SSL、压缩、缓存。
- 负载均衡:把流量分发到多台后端服务器(轮询、权重、IP 哈希、最少连接)。
- API 网关:路由、限流、鉴权前置(配合 OpenResty/Lua 或 Kong)。
- SSL 终端:统一管理 HTTPS 证书,后端用明文 HTTP。
- WebSocket / HTTP/2 / HTTP/3:原生支持新协议。
- 流媒体:HLS、MP4、FLV 直播点播。
社区与生态:开源版 vs Plus 版
- Nginx Open Source:免费、BSD 许可,本系列所有内容都基于此。
- Nginx Plus:F5 公司的商业版,加动态 API、主动健康检查、Dashboard、Session Persistence 等企业功能。
- OpenResty:基于 Nginx + LuaJIT 的扩展版(章亦春出品),能用 Lua 写业务逻辑,国内非常多公司在用(知乎、又拍云、GitHub 上的 Kong API 网关)。
- Tengine:淘宝开源的 Nginx 分支,加了动态模块、一致性哈希等中国互联网常用功能。
- Caddy:Go 写的竞品,自动 HTTPS,但生态和性能仍不及 Nginx。
该不该学 Nginx?
如果你的方向是后端开发、运维、DevOps、SRE、云原生,Nginx 是必修课。哪怕你只是个前端,要把个人项目部署上线,也绕不开它。学完本系列,你能:
- 独立配置一个生产可用的 HTTPS 静态站点;
- 在 Node.js/Python 应用前挡一层 Nginx 反向代理;
- 用 upstream 做负载均衡、灰度发布;
- 用日志和 systemtap 定位线上性能瓶颈。
← 返回 Nginx 教程目录
下一篇 Nginx 安装 →