什么是 Nginx?
Nginx(读作 “engine x”)是一个开源的高性能 HTTP 服务器,也是一种常用的反向代理、负载均衡器和静态资源服务器。它通常放在客户端与应用服务之间,负责接收连接、匹配规则、返回文件,或把请求转发给后端服务。

一台 Nginx 可以同时承担几件事:直接返回 HTML、CSS、JavaScript 和图片;终止 HTTPS 连接;把 /api 请求转发给应用;再把请求分配给多台后端服务器。客户端通常只看到 Nginx 的域名和地址,不需要知道后面具体运行着几台机器。
一句话定义:Nginx 是一个以事件驱动和异步非阻塞为基础的网络入口层,用较少的进程管理大量连接,并统一处理转发、静态文件、TLS、日志和流量策略。
Nginx 为什么会出现?它解决了什么问题?
Nginx 的诞生与 C10K 问题有关。C10K 指的是单台服务器同时处理一万个客户端连接的挑战,重点是“连接数量”,不只是每秒请求数。

Nginx 最早由俄罗斯工程师伊戈尔·赛索耶夫开发,并在 2004 年公开发布。那时 Web 服务器需要长期保持越来越多的连接,传统模型的资源成本开始暴露。

传统 Web 服务器常见的做法是“一个连接对应一个进程或线程”。连接数上升后,会出现三类成本:
- 内存成本:每个进程或线程都需要栈、上下文和运行时结构,连接越多,常驻内存越大。
- 调度成本:CPU 要在大量执行单元之间切换,缓存命中率下降,上下文切换变多。
- 等待成本:很多连接其实只是在等待网络数据,却仍然占用一个执行单元。
Nginx 的思路是把“等待网络”与“执行应用逻辑”分开:网络入口只保留少量 worker,worker 负责快速处理已经就绪的连接;慢数据库查询、业务计算等工作交给后端应用。它降低的是连接管理成本,不会让后端业务计算凭空消失。
Nginx 为什么能扛住高并发?
Nginx 的高并发能力主要来自“少量 worker + 事件循环 + 非阻塞 IO”,而不是某一个神奇参数。典型进程模型如下:

- Master 进程管理生命周期:读取和检查配置,启动 worker,并在重载或异常时管理它们。
- Worker 进程处理连接:通常按 CPU 核数配置 worker,让每个 worker 在独立事件循环中工作。
- IO 多路复用等待事件:Linux 常用
epoll,macOS 和 BSD 系统常见kqueue。一个等待调用可以监听大量套接字。 - 只处理已就绪的 IO:连接没有数据时,worker 不会被一个连接长时间阻塞;有数据可读或可写时,事件循环才处理它。
- 尽快交回执行权:Nginx 适合做短、快、非阻塞的网络工作;耗时任务应由后端服务异步化或拆分。

可以把它想象成一个柜台:传统模型可能为每位排队者安排一名专职员工,即使对方只是等待材料;Nginx 让少量员工轮询所有窗口,只处理当前已经准备好的事项。这样,等待连接不会线性消耗线程和内存。
需要区分两个指标:并发连接数是同时保持的连接数量,吞吐量是单位时间完成的请求数量。Nginx 可以高效管理大量空闲或短请求连接,但实际吞吐量仍取决于 CPU、网络带宽、响应大小、TLS、磁盘、后端延迟和配置。
正向代理和反向代理有什么区别?
正向代理代理客户端,反向代理代理服务端。两者都位于通信链路中间,但隐藏的对象和配置目标不同。

| 维度 | 正向代理 | 反向代理(Nginx 常见用法) |
|---|---|---|
| 代理谁 | 客户端 | 服务端 |
| 客户端是否知道后端 | 通常知道自己在使用代理 | 通常只知道 Nginx 地址 |
| 目标 | 访问控制、出口统一、缓存或匿名访问 | 转发请求、隐藏拓扑、TLS 终止、负载均衡 |
| 典型例子 | 企业出口代理、浏览器代理 | 网站网关、API 入口、应用集群前置层 |
正向代理的例子是:你的浏览器把请求发给代理服务器,再由代理访问目标站点,目标站点看到的是代理出口地址。反向代理的例子是:用户请求 https://example.com/api/orders,Nginx 再把它转给内网中的应用服务器。
反向代理是怎么工作的?
反向代理的核心流程是“接收请求 → 匹配规则 → 选择上游 → 转发 → 返回响应”。

一次 /api/orders 请求可以这样走:
- DNS 将
example.com解析到 Nginx 的公网地址。 - 客户端与 Nginx 建立 TCP/TLS 连接并发送 HTTP 请求。
- Nginx 根据
server和location规则识别/api/。 - Nginx 通过
proxy_pass把请求发送到某个后端地址。 - 后端生成响应,Nginx 将响应返回给客户端。

统一入口带来三类直接收益:
- 隐藏拓扑:应用服务器可以放在内网,只允许 Nginx 访问。
- 集中处理 HTTPS:证书、TLS 协议和续期配置集中在入口层,后端可以使用内网 HTTP 或独立 TLS 策略。
- 统一治理流量:访问日志、请求体大小、限流、超时、跨域响应头和安全响应头可以按站点或路径统一设置。
反向代理不是安全边界的全部。后端仍应校验身份和权限,网络层也应限制来源;不能因为客户端看不到后端地址,就跳过应用层安全控制。
Nginx 如何做负载均衡?
当后端有多台应用服务器时,Nginx 可以把请求分配到 upstream 服务器组。负载均衡减少单机压力,也让滚动发布、故障摘除和水平扩容更容易。

常见策略如下:
| 策略 | 分配方式 | 优点 | 注意事项 |
|---|---|---|---|
轮询 round robin | 按顺序轮流发送 | 简单、默认、适合后端规格相近 | 不感知请求耗时和会话状态 |
最少连接 least_conn | 优先选择当前连接数较少的服务器 | 长连接或请求耗时差异大时更合理 | 连接数不等于真实 CPU 或队列压力 |
IP 哈希 ip_hash | 根据客户端 IP 计算固定后端 | 在一定程度上保持会话粘性 | NAT 用户可能集中;后端变化会影响映射 |

例如,三台后端每台在当前业务下约能处理每秒 1000 个请求,均匀分配时理论总吞吐量约为每秒 3000 个请求。但这只是容量估算,不是 Nginx 的性能保证:网络、数据库、请求分布、失败重试和长连接都会改变结果。
生产环境还要考虑健康检查、失败重试、连接超时、优雅下线和会话状态。开源 Nginx 的被动失败探测可以在请求失败后暂时避开节点;更主动的健康检查、服务发现和跨区域流量调度可能需要 Nginx Plus、云负载均衡器或专门的服务治理系统。
Nginx 为什么处理静态资源很快?
静态资源是无需实时业务计算的文件,例如图片、CSS、JavaScript、字体和已经构建好的 HTML。Nginx 可以直接读取文件并返回,不必让 Node.js、Java、Go 或 Python 应用参与每次传输。

这样做的价值是把后端资源留给登录、下单、查数据库等动态逻辑。Nginx 还可以配合 sendfile、缓存控制、压缩和范围请求减少复制与传输成本,但静态文件性能仍会受到磁盘、文件大小、网络和 CDN 缓存命中率影响。
一个常见的前后端部署方式是:

/:返回前端构建目录中的index.html和静态文件。/assets/:直接返回带长期缓存策略的 JS、CSS、字体和图片。/api/:通过反向代理发送给后端应用。- 同一个域名:页面和 API 共享来源,通常不需要额外处理跨域。
nginx.conf 的配置是怎样一层层匹配的?
Nginx 配置像一棵树:http 管全局 HTTP 能力,server 定义一个虚拟主机,location 再按请求路径细分处理方式;upstream 用来声明后端服务器组。

下面是一份最小但完整的示例:
http {
upstream app_backend {
least_conn;
server 10.0.0.11:8080;
server 10.0.0.12:8080;
}
server {
listen 80;
server_name example.com;
root /srv/www/frontend;
location /assets/ {
try_files $uri =404;
expires 7d;
}
location /api/ {
proxy_pass http://app_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
try_files $uri $uri/ /index.html;
}
}
}
这段配置表达了四个决定:静态文件从哪里读、/assets/ 如何缓存、/api/ 发给哪组后端、前端路由找不到文件时回退到哪个入口。修改后应先运行 nginx -t 检查语法,再用平滑重载让新 worker 接管连接。
Nginx 和 Apache 应该怎么选?
Nginx 与 Apache 都能提供 HTTP 服务,区别主要在默认架构、动态配置方式和常见部署角色。今天两者也可以组合使用,不能简单用“谁全面更强”下结论。
| 维度 | Nginx | Apache HTTP Server | 选择建议 |
|---|---|---|---|
| 高并发连接 | 事件驱动、少量 worker,适合大量连接 | 可用事件 MPM,但历史上常见进程/线程模型 | 入口代理、静态文件和长连接常优先评估 Nginx |
| 动态内容 | 通常转发给独立应用运行时 | 可通过模块或 CGI 等方式集成 | 依赖 Apache 模块生态时继续使用 Apache |
| 配置方式 | 集中式 nginx.conf,改动通常需重载 | 支持 .htaccess 目录级覆盖 | 需要用户自行改目录配置时 Apache 更方便 |
| 典型角色 | 反向代理、负载均衡、静态资源入口 | Web 服务器、模块化应用平台 | 以实际运维经验和应用兼容性为准 |
多数项目的合理问题不是“哪个绝对更快”,而是“入口层是否需要事件驱动、统一代理和集中治理,以及团队是否已有稳定的另一套运维体系”。
使用 Nginx 有哪些限制和常见错误?
Nginx 解决的是网络入口与连接调度问题,不会自动解决所有性能和可用性问题。上线前至少检查以下事项:
- 把阻塞业务塞进 Nginx:Nginx 不适合直接执行复杂业务、慢数据库查询或长时间脚本;应转发给应用服务。
- 误读负载均衡容量:三台机器的理论吞吐量不一定是简单相加,数据库、网络和共享依赖可能先成为瓶颈。
- 忽略超时与重试:过短会误杀慢请求,过长会占满连接;重试非幂等请求还可能造成重复下单。
- 错误处理真实客户端 IP:多层代理下应配置可信代理列表,不能无条件相信客户端自己提交的
X-Forwarded-For。 - 只在入口做认证:Nginx 的路径规则和 TLS 终止不能替代后端授权、输入校验与审计。
- 静态缓存没有版本策略:长期缓存的 JS/CSS 应使用内容哈希文件名,否则发布后用户可能继续拿到旧资源。
- 忽略 WebSocket 和 HTTP/2 细节:升级头、读取超时、连接数和代理缓冲区需要按协议和业务单独配置。
- 只改配置不验证:使用
nginx -t检查语法,并通过监控观察 4xx/5xx、连接数、上游延迟、带宽和错误日志。
Nginx 的高并发优势建立在“快速、非阻塞、职责清晰”的前提上。配置越复杂,越需要用压测和指标验证,而不是只复制网上的参数模板。
常见问题
Nginx 是 Web 服务器还是反向代理?
两者都是。Nginx 可以直接提供 HTTP 服务并返回静态文件,也可以作为反向代理把请求转发给应用服务器;在生产环境中,这两种角色经常同时存在。
Nginx 为什么比 Apache 更能扛高并发?
常见原因是 Nginx 用少量 worker 和事件驱动的非阻塞 IO 管理连接,避免“一连接一线程”带来的内存和调度成本。但 Apache 也支持事件 MPM,真实差异取决于版本、模块、请求类型、TLS、硬件和配置,不能只凭产品名称判断。
Nginx 的 worker 进程越多越好吗?
不是。通常让 worker 数量接近 CPU 核数即可;过多 worker 会增加调度和资源竞争。应结合 CPU 使用率、连接数、请求延迟和 worker_connections 等配置压测,而不是盲目调大。
Nginx 能替代后端应用服务器吗?
只能在静态文件、简单重写、缓存或部分协议代理场景下替代一部分工作。登录、下单、权限判断、数据库访问等业务逻辑仍需要应用服务器或其他后端服务。
Nginx 负载均衡后,用户会一直访问同一台服务器吗?
默认轮询不会保证这一点。ip_hash 能按客户端 IP 提供一定的会话粘性,但会受到 NAT、代理和后端变化影响。更稳妥的做法通常是把会话放入共享存储,或使用无状态令牌。
Nginx 能保证后端永远可用吗?
不能。它可以探测部分失败、摘除异常节点并分摊流量,但数据库、依赖服务、网络分区和整台入口故障仍需要副本、监控、故障切换、备份和演练共同解决。
总结:把 Nginx 理解成高效的入口调度员
Nginx 是高性能 HTTP 服务器、反向代理、负载均衡器和静态资源服务器。它用少量 worker 进程、事件驱动和异步非阻塞 IO 管理大量连接;用反向代理隐藏后端并统一处理入口;用负载均衡分摊多台服务器的请求;用静态文件服务减轻应用压力。

看 Nginx 配置时,可以按四个问题拆解:谁在监听?什么路径匹配?请求转发到哪里?响应由谁返回? 这四个问题对应 server、location、proxy_pass/upstream 和静态文件或上游响应。理解了这条链路,绝大多数 Nginx 部署就不再神秘。

