43 分钟
部署与基础设施工程

Web 服务器与反向代理:Nginx 为什么是部署的标配

分清静态托管与动态后端、正向代理与反向代理,讲清 Nginx 为什么能扛高并发,以及它在生产中承担的 TLS 终止、反向代理、负载均衡、静态资源、压缩缓存、安全限流六大职责

  • 分清静态资源服务与动态后端,理解为什么生产中要在应用前挡一层 Web 服务器
  • 分清正向代理与反向代理,说清反向代理到底「代理」了什么
  • 理解 Nginx 事件驱动模型为什么省资源、能扛并发
  • 掌握反向代理的六大职责与负载均衡的基本算法

为什么不能让用户直连你的 Node 程序

初学部署时常想:我直接让 Node 监听 80 端口、用户直连不就行了?小型 demo 可以,但生产几乎都要在应用服务器前挡一层专门的 Web 服务器(最常见就是 Nginx,读作 Engine-X)。原因是:Node/Python 这类应用擅长写业务逻辑,却不擅长直接面对海量连接、TLS 加解密、静态文件、攻击与峰值流量;而 Nginx 恰恰是为高效处理网络连接而生的。这一课讲清它到底做什么、下一课讲怎么配。

静态资源 vs 动态后端

网页请求分两类。静态资源是构建时就确定、对谁都一样的文件:HTML、JS、CSS、图片、字体,Nginx 可以直接从磁盘读了就发,极快、还能缓存。动态响应是要现算的:调数据库、调大模型、按用户返回不同数据,这部分要交给后端程序。像朋友好学这样用 Next.js 静态导出的应用,绝大多数页面是静态文件由 Nginx 直接发,只有 /api 这类请求才被转发给 Node,负载因此很轻。

ℹ️静态站点生成(SSG)为什么又快又稳

Next.js 可以在构建时把页面预先渲染成静态 HTML(朋友好学的 200 多节课程页就是构建期生成的静态文件),用户访问时 Nginx 直接发文件,不需要服务器实时渲染——既快、又能扛高并发,还显著降低被攻击面。需要动态的部分(AI 对话、进度同步)才走 API。这是「能静态就静态、动态只留给真正需要实时计算的部分」的典型架构。

正向代理与反向代理

「代理」是中间人,但方向相反:正向代理替「客户端」出面(如科学上网工具、公司出口代理、爬虫代理 IP),服务器不知道真正的客户端是谁;反向代理替「服务器」出面,用户只知道在访问一个域名,不知道后面是几台、什么技术栈的机器。Nginx 做的是反向代理:对外是统一入口,对内决定请求转给谁。

示例
用户 --HTTPS--> [ Nginx 反向代理 :443 ]
                        |-- 静态文件 / 课程页 -> 直接读磁盘返回
                        |-- /api/*           -> 转给 127.0.0.1:5180 (Node)
                        |-- /tts/*           -> 转给 127.0.0.1:5002 (TTS)
                        (后端们都绑 127.0.0.1,公网只看见 Nginx)

Nginx 为什么能扛高并发:事件驱动

传统服务器用「一个连接占一个线程」的模型,几千连接就要几千线程,线程切换和内存开销巨大。Nginx 采用事件驱动 + 异步非阻塞:一个 worker 进程同时「照看」成千上万个连接,哪个连接准备好了就处理哪一下,不空等。所以它常以很少的内存扛住上万并发连接,这也是让它而不是 Node 直接面对公网的核心原因。

反向代理的六大职责

配对题Nginx 职责与它解决的问题配对

负载均衡是反向代理的自然延伸:当一台后端不够,就在 upstream 里写多台,Nginx 按策略分发。常见算法:轮询(默认、挨个来)、加权轮询(机器强的多分点)、ip_hash(同一客户端固定到同一台,利于会话)、least_conn(分给当前最闲的)。后端某台挂了,Nginx 还能做健康检查、把它临时摘除,用户几乎无感。

选学

TLS 终止:为什么后端可以只跑 HTTP(选学)

HTTPS 的加解密很耗 CPU。常见架构是让 Nginx 负责对外的 TLS(叫 TLS 终止/TLS 卸载):用户到 Nginx 是加密的 HTTPS,Nginx 解密后通过本机/内网用明文 HTTP 转给 127.0.0.1 上的后端。因为这段路在同一台机器或受信任内网、不出公网,所以是安全的,后端也省去了管理证书和加解密的负担。

如果内网也不可信(比如后端在另一台、跨机房),可以让 Nginx 到后端再走一次 HTTPS,这叫 TLS 重新加密,安全性更高但更复杂,独立开发者单机部署通常用 TLS 终止即可。

🐍资深杂谈:Nginx 是你系统的「统一咽喉」,价值不止转发

把 Nginx 放在唯一入口,会得到一个意外好处:所有横切关注点只在一处解决——HTTPS、限流、访问日志、跨域头、缓存策略、灰度分流、甚至把 /api/app/version 精确分流到正确的后端(朋友好学就靠精确 location 让同一台机器上两个产品共用 80 端口而互不干扰)。这些如果散落在各个应用里,既重复又容易不一致。设计系统时,先想清楚「在 Nginx 这一层统一做什么」,后端就能专注业务。

选择题

下列对「反向代理」的描述,最准确的是?

本节小结

生产中在应用前挡 Nginx:静态资源(构建产物、SSG 页面)由它直接读盘返回、动态 /api 才转后端,能静态就静态。正向代理替客户端、反向代理替服务器,Nginx 是后者。它靠事件驱动异步非阻塞、少量 worker 照看海量连接,因而省资源扛并发。六大职责:TLS 终止(对外HTTPS、对内本机明文)、反向代理按路径分发、负载均衡(轮询/加权/ip_hash/least_conn+故障摘除)、静态压缩缓存、安全限流与安全头、多站点共存。Nginx 是统一咽喉,横切关注点集中一处治理。

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

从浏览器到你的应用,一次请求依次经过 DNS 解析、TCP 三次握手、TLS 握手、反向代理、上游应用,再到数据库或缓存,沿原路返回。每一跳都可能是延迟或故障点,所以排错要分层推进:先确认域名解析和端口连通,再看证书是否有效,最后看应用日志与依赖,而不是出问题就先重启。能把链路一层层说清,定位线上故障会快一个数量级。