分类:Web 开发
  Nginx 是高性能 HTTP 服务器、反向代理和负载均衡器,它用事件驱动的 worker 进程管理大量连接,并通过统一入口和静态资源处理降低后端压力。

什么是 Nginx?

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

Nginx 作为高性能 HTTP 服务器、反向代理和负载均衡器的三种身份

  一台 Nginx 可以同时承担几件事:直接返回 HTML、CSS、JavaScript 和图片;终止 HTTPS 连接;把 /api 请求转发给应用;再把请求分配给多台后端服务器。客户端通常只看到 Nginx 的域名和地址,不需要知道后面具体运行着几台机器。

  一句话定义:Nginx 是一个以事件驱动和异步非阻塞为基础的网络入口层,用较少的进程管理大量连接,并统一处理转发、静态文件、TLS、日志和流量策略。

Nginx 为什么会出现?它解决了什么问题?

  Nginx 的诞生与 C10K 问题有关。C10K 指的是单台服务器同时处理一万个客户端连接的挑战,重点是“连接数量”,不只是每秒请求数。

Nginx 从 C10K 问题出发,用事件驱动模型应对大量并发连接

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

传统 Apache 服务器使用进程或线程承载连接时的资源瓶颈

  传统 Web 服务器常见的做法是“一个连接对应一个进程或线程”。连接数上升后,会出现三类成本:

  1. 内存成本:每个进程或线程都需要栈、上下文和运行时结构,连接越多,常驻内存越大。
  2. 调度成本:CPU 要在大量执行单元之间切换,缓存命中率下降,上下文切换变多。
  3. 等待成本:很多连接其实只是在等待网络数据,却仍然占用一个执行单元。

  Nginx 的思路是把“等待网络”与“执行应用逻辑”分开:网络入口只保留少量 worker,worker 负责快速处理已经就绪的连接;慢数据库查询、业务计算等工作交给后端应用。它降低的是连接管理成本,不会让后端业务计算凭空消失。

Nginx 为什么能扛住高并发?

  Nginx 的高并发能力主要来自“少量 worker + 事件循环 + 非阻塞 IO”,而不是某一个神奇参数。典型进程模型如下:

Nginx 使用 master 管理少量 worker,并让 worker 通过事件循环处理多个连接

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

Nginx 的事件驱动、非阻塞 IO 和少量进程共同支撑高并发连接

  可以把它想象成一个柜台:传统模型可能为每位排队者安排一名专职员工,即使对方只是等待材料;Nginx 让少量员工轮询所有窗口,只处理当前已经准备好的事项。这样,等待连接不会线性消耗线程和内存。

  需要区分两个指标:并发连接数是同时保持的连接数量,吞吐量是单位时间完成的请求数量。Nginx 可以高效管理大量空闲或短请求连接,但实际吞吐量仍取决于 CPU、网络带宽、响应大小、TLS、磁盘、后端延迟和配置。

正向代理和反向代理有什么区别?

  正向代理代理客户端,反向代理代理服务端。两者都位于通信链路中间,但隐藏的对象和配置目标不同。

正向代理代理客户端,反向代理代理服务端,两种代理方向相反

维度 正向代理 反向代理(Nginx 常见用法)
代理谁 客户端 服务端
客户端是否知道后端 通常知道自己在使用代理 通常只知道 Nginx 地址
目标 访问控制、出口统一、缓存或匿名访问 转发请求、隐藏拓扑、TLS 终止、负载均衡
典型例子 企业出口代理、浏览器代理 网站网关、API 入口、应用集群前置层

  正向代理的例子是:你的浏览器把请求发给代理服务器,再由代理访问目标站点,目标站点看到的是代理出口地址。反向代理的例子是:用户请求 https://example.com/api/orders,Nginx 再把它转给内网中的应用服务器。

反向代理是怎么工作的?

  反向代理的核心流程是“接收请求 → 匹配规则 → 选择上游 → 转发 → 返回响应”。

Nginx 反向代理从客户端接收请求,按路径转发到后端并返回响应

  一次 /api/orders 请求可以这样走:

  1. DNS 将 example.com 解析到 Nginx 的公网地址。
  2. 客户端与 Nginx 建立 TCP/TLS 连接并发送 HTTP 请求。
  3. Nginx 根据 server 和 location 规则识别 /api/。
  4. Nginx 通过 proxy_pass 把请求发送到某个后端地址。
  5. 后端生成响应,Nginx 将响应返回给客户端。

反向代理统一入口后,可以集中处理证书、日志和限流

  统一入口带来三类直接收益:

  • 隐藏拓扑:应用服务器可以放在内网,只允许 Nginx 访问。
  • 集中处理 HTTPS:证书、TLS 协议和续期配置集中在入口层,后端可以使用内网 HTTP 或独立 TLS 策略。
  • 统一治理流量:访问日志、请求体大小、限流、超时、跨域响应头和安全响应头可以按站点或路径统一设置。

  反向代理不是安全边界的全部。后端仍应校验身份和权限,网络层也应限制来源;不能因为客户端看不到后端地址,就跳过应用层安全控制。

Nginx 如何做负载均衡?

  当后端有多台应用服务器时,Nginx 可以把请求分配到 upstream 服务器组。负载均衡减少单机压力,也让滚动发布、故障摘除和水平扩容更容易。

Nginx 把请求分散到多台后端服务器,以降低单机压力并提升可用性

  常见策略如下:

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

三种 Nginx 负载均衡策略:轮询、最少连接和 IP 哈希

  例如,三台后端每台在当前业务下约能处理每秒 1000 个请求,均匀分配时理论总吞吐量约为每秒 3000 个请求。但这只是容量估算,不是 Nginx 的性能保证:网络、数据库、请求分布、失败重试和长连接都会改变结果。

  生产环境还要考虑健康检查、失败重试、连接超时、优雅下线和会话状态。开源 Nginx 的被动失败探测可以在请求失败后暂时避开节点;更主动的健康检查、服务发现和跨区域流量调度可能需要 Nginx Plus、云负载均衡器或专门的服务治理系统。

Nginx 为什么处理静态资源很快?

  静态资源是无需实时业务计算的文件,例如图片、CSS、JavaScript、字体和已经构建好的 HTML。Nginx 可以直接读取文件并返回,不必让 Node.js、Java、Go 或 Python 应用参与每次传输。

Nginx 直接从磁盘或缓存返回图片、CSS、JavaScript 和 HTML 等静态资源

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

  一个常见的前后端部署方式是:

Nginx 同时托管前端构建文件,并把 /api 请求转发给后端服务

  • /:返回前端构建目录中的 index.html 和静态文件。
  • /assets/:直接返回带长期缓存策略的 JS、CSS、字体和图片。
  • /api/:通过反向代理发送给后端应用。
  • 同一个域名:页面和 API 共享来源,通常不需要额外处理跨域。

nginx.conf 的配置是怎样一层层匹配的?

  Nginx 配置像一棵树:http 管全局 HTTP 能力,server 定义一个虚拟主机,location 再按请求路径细分处理方式;upstream 用来声明后端服务器组。

Nginx 配置由 http、server、location 和 upstream 等层级组成

  下面是一份最小但完整的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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 解决的是网络入口与连接调度问题,不会自动解决所有性能和可用性问题。上线前至少检查以下事项:

  1. 把阻塞业务塞进 Nginx:Nginx 不适合直接执行复杂业务、慢数据库查询或长时间脚本;应转发给应用服务。
  2. 误读负载均衡容量:三台机器的理论吞吐量不一定是简单相加,数据库、网络和共享依赖可能先成为瓶颈。
  3. 忽略超时与重试:过短会误杀慢请求,过长会占满连接;重试非幂等请求还可能造成重复下单。
  4. 错误处理真实客户端 IP:多层代理下应配置可信代理列表,不能无条件相信客户端自己提交的 X-Forwarded-For。
  5. 只在入口做认证:Nginx 的路径规则和 TLS 终止不能替代后端授权、输入校验与审计。
  6. 静态缓存没有版本策略:长期缓存的 JS/CSS 应使用内容哈希文件名,否则发布后用户可能继续拿到旧资源。
  7. 忽略 WebSocket 和 HTTP/2 细节:升级头、读取超时、连接数和代理缓冲区需要按协议和业务单独配置。
  8. 只改配置不验证:使用 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 作为高效入口调度员,统一连接、代理、负载均衡和静态资源处理

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