15 分钟
全栈开发

部署上线全景与本产品架构对照

三种上线形态、本产品真实链路、Nginx 与 PM2 各管什么

  • 知道静态托管 / Node 常驻 / 容器三种上线形态的真实成本量级
  • 能讲清本产品(朋友好学)的真实部署链路与选型权衡
  • 理解 Nginx 反代和 PM2 cluster 常驻各是干嘛的
  • 知道蓝绿部署与滚动更新的区别、哪些深挖归 s15
💡高中搭桥:像开一家店

菜单印好能外带 = 静态导出;也能现场现做 = Node 常驻进程。Nginx 是门口接待,把客人引导到不同窗口;PM2 是打烊了还帮你看着店,店门(进程)倒了立刻重新拉开。

三种上线形态

ℹ️静态托管 / Node 常驻 / 容器

静态托管:纯 HTML/JS/CSS 不需要跑服务,丢到 CDN 或对象存储就能访问。最快最省,适合官网、文档、博客。 Node 常驻:有 API 要一直跑(node server.js),需要一台服务器常驻进程。 容器:打包成 Docker 镜像,环境一致、方便多机编排,版本与用法以官方最新文档为准。

三种形态的真实成本量级(示例口径)

云产品价格随时在变,下面只是帮你建立量级感,实际以云厂商官方最新报价为准(轻量应用服务器、对象存储、CDN 分别计价)。静态托管几乎只花 CDN + 对象存储的钱:1 万月活的小官网,一个月可能就几块到几十块,因为没有常驻服务器,请求都压在 CDN 上。

Node 常驻要租一台 2核2G 云服务器 7×24 跑着,按包年包月算——这是固定成本,哪怕一个用户都没有也在烧钱。容器化本身不省钱,它省的是环境一致性和运维人力;Serverless 按调用次数和执行时长计费,没人访问时不花钱,但冷启动和突发流量是代价。

ℹ️成本量级口诀

静态托管 ≈ CDN 流量钱(浮动、最低)。Node 常驻 ≈ 一台服务器包月(固定成本,没人访问也烧)。Serverless ≈ 按次计费(波动成本,有冷启动代价)。选型先问一句:有没有必须常驻的 API?没有就别养常驻服务器。

静态导出的局限

Next.js 静态导出(SSG)把页面在构建时就生成成 HTML,快、便宜、能套 CDN。但它有硬伤:构建完就是死文件,不能做服务端渲染(不能根据登录用户动态出页面)、不能在请求时查数据库。需要动态内容和 API 时,就得另起一个常驻服务——这正是本产品除了静态导出还要 node server.js 的原因。别以为静态导出万能,凡是「打开页面才查数据」的需求它都接不住。

本产品真实链路对照

朋友好学这套产品的上线形态很典型,串起来是这样:

示例
# 本产品真实链路(静态示意)
# 浏览器 / App
#   ↓ Capacitor 把 Next.js 页面套成手机 App
# Next.js 静态导出(课程页 SSG)
#   ↓ 零依赖 node server.js 提供少量 API
# Nginx 反向代理:80/443 入口,分流静态与 API
#   ↓ PM2 常驻守护 node server.js,挂了自动拉起
# 腾讯云服务器
#   ↓ 数据存 SQLite / JSON 文件,不依赖外部数据库

Nginx 为什么必须加在前面

为什么不直接让浏览器访问 node server.js?Nginx 在前面至少干四件事。SSL 终止:HTTPS 证书配置在 Nginx,node 进程跑明文 HTTP 就行,不用每个进程都管证书续期。静态缓存:图片、JS、CSS 由 Nginx 直接读文件返回,不打扰 node。按路径分流:/api 开头转给 node,其余直接出静态文件。限流:Nginx 能在入口挡住恶意刷请求,别让它们冲到 node 进程。

为什么 HTTPS 终止放 Nginx 而不是 node:证书自动续期(certbot)、HTTP/2、gzip 压缩这些在 Nginx 一层配一次就全局生效,node 进程只管业务逻辑;以后换语言重写后端,Nginx 这层都不用动。

PM2 cluster 与负载均衡

单进程 Node 同一时刻只能吃满一个 CPU 核。PM2 的 cluster mode 能一把拉起多个 node 子进程(数量等于 CPU 核数),内部自带负载均衡把请求分发过去,单机就多核并行。再往上多机扩容,才需要 Nginx 或云负载均衡器在多台机器之间分发流量。所以 PM2 解决的是「单机多核 + 崩溃自愈」,不是「多机高可用」。

本产品为什么不引 Express

本产品 API 极少(就几个接口),用零依赖 node server.js 手写路由,而不是引入 Express 这种框架。真实权衡:引入 Express 立刻多一层依赖、多一份升级维护和安全补丁成本,而一个 if-else 路由表就能满足全部需求;零依赖意味着 node server.js 拷过去直接跑,不用 npm install 一大坨,部署面和攻击面都最小。代价是路由、中间件、参数校验都得自己写,接口一多就会失控——所以这是「小项目的刻意选择」,不是通用推荐,真到十几个接口就该上框架了。

数据存储同理:本产品用 SQLite / JSON 文件,是因为写入量极小、单文件好备份好迁移。它的硬伤是写并发——SQLite 同一时刻只允许一个写,一旦上量到多人同时写,写锁会排队成为瓶颈,那时才该迁到 PostgreSQL/MySQL。记住这条线:小项目先把最简单的跑起来,瓶颈出现了再换,别一上来就上最重型的栈。

蓝绿部署 vs 滚动更新

上线新版本怎么不停机?蓝绿部署:同时跑两套环境(蓝=旧版,绿=新版),流量先全在蓝,切到绿验证没问题再下线蓝,回滚就是切回蓝。它快、零停机,但要双倍机器资源。滚动更新:一台一台(或一个实例一个实例)换新版本,旧的没下完新的就上,省机器但新旧版本短暂共存,要求接口向后兼容。小项目用 PM2 reload 或直接重启就够,这两套是多机集群的事,归 s15。一句话选型:能接受双倍机器、要秒级回滚选蓝绿;想省资源、接口能向后兼容选滚动。

ℹ️Nginx 与 PM2 各管什么

Nginx:门口接待,负责 HTTPS 终止、静态缓存、按路径分流、入口限流。PM2:进程保姆,让 node server.js 后台常驻、崩溃自动重启、开机自启、cluster 多核。systemd 是 Linux 原生的同类守护方案,实操归 s15-m4。

哪些归后面阶段深挖

Docker 镜像打包、Nginx 高级配置、CI/CD 自动发布、Kubernetes 编排,这些是 s15「部署与基础设施工程」的内容。s7 这一层只要建立全景图,知道每个零件在链路里站哪、各自解决什么权衡。

🐍回扣技术栈,不重写

这节课专门对照本产品技术栈:Next.js 静态导出 + Capacitor 套壳 + 零依赖 node server.js + Nginx 反代 + PM2 常驻 + 腾讯云 + SQLite/JSON 文件存储。交叉引用 s15,这里不展开实操。

选择题

朋友好学的课程页是 Next.js 静态导出,但又需要一个常驻的 node server.js 提供 API,最合适的上线组合是?

选择题

一个纯官网、没有任何后端 API、月活 1 万。从成本量级看,最划算的上线方式是?

填空题填写空白处的代码
PM2 的作用是让 Node 进程 ,挂了自动重新拉起。

资深工程师加餐

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

穿透是反复查「根本不存在」的数据,用布隆过滤器或缓存空值挡;击穿是某个热点 key 过期瞬间大量请求压向数据库,用互斥重建或逻辑过期;雪崩是大批 key 同时过期,给 TTL 加随机抖动。缓存与库的一致性常用「先更新数据库、再删除缓存」,并靠重试/订阅补偿。

挑战任务

按场景选部署形态

简单+50 XP

场景:你手上有三个不同项目要上线。写 pick_deploy(scenario):含 Docker/容器 返回 容器,含 node server.js/常驻 返回 Node 常驻,其余返回 静态托管——按从重到轻匹配。

按场景选部署形态
1 个测试用例

课后作业

给你的产品选部署形态

中等+30 XP

场景:你的产品 1 万月活、API 很少、还在快速迭代。请判断该用静态托管、Node 常驻还是 Serverless,写一句话理由,并粗估它每月大概烧在哪类成本上。

给你的产品选部署形态
1 个测试用例