Skip to content

SSR 官网部署:Cloudflare、Nginx 与 Node 各管哪一层 ​

这是一次和 DeepSeek 的问答记录,按我的提问顺序整理。回答保留原文表述,只去掉了引用标记和对话里的客套收尾。开头的思维导图和图解说明是整理时补充的背景知识。

整条链路 ​

图解说明 ​

入口:Cloudflare(对应问题 1、6)

用户访问的始终是域名。DNS 记录开启「橙云代理」后,解析出来的是 Cloudflare 边缘节点的 IP,源站真实地址对外不可见。SSL 有几档:「灵活」只加密用户到 Cloudflare 这一段,Cloudflare 到源站是明文;「完全」两段都加密,但不校验源站证书;「完全(严格)」要求源站证书有效,用 Cloudflare 签发的 Origin 证书即可,生产环境应选这一档。Cloudflare 默认只缓存图片、CSS、JS 等静态资源,HTML 是否缓存取决于缓存规则和源站返回的 Cache-Control。回源有两种方式:Cloudflare 连接源站的公网入口,或者在源站运行 cloudflared 主动建立隧道(Tunnel),后者源站不需要开放任何公网端口。

网关:Nginx(对应问题 1、2、6)

Nginx 是源站的第一站:在 443 端口接收 Cloudflare 的回源请求,用 Origin 证书完成 TLS 握手,再按 location 规则分流,/api 可以直接转发给后端,其余交给 Node 做 SSR,静态资源则由 Nginx 直接返回。因为 TCP 连接来自 Cloudflare 节点,Nginx 看到的源 IP 是 Cloudflare 的,需要 realip 模块从 CF-Connecting-IP 头还原用户 IP。这里有个安全前提:set_real_ip_from 只能填 Cloudflare 公布的 IP 段,否则任何人伪造这个请求头都能冒充 IP。在 K8s 里,这个角色常由 Ingress Controller 承担,比如 ingress-nginx,本质上也是 Nginx。

应用:Node(Nuxt / Nitro)(对应问题 3、4、5)

SSR 项目的构建产物不是一堆静态文件,而是一个服务端程序。Nuxt 3 执行 nuxt build 后生成 .output,其中的 Nitro 服务通过 node .output/server/index.mjs 启动,默认监听 3000 端口。Node 层除了渲染页面,还可以承担 BFF(Backend for Frontend)职责:统一鉴权、聚合多个后端接口并裁剪字段、做缓存。这些逻辑用 JS/TS 写在 server/ 目录下,前端可以开发,但要补上服务端的安全、缓存一致性和容错知识。补充一点:「必须运行在 Node 上」指的是 Nitro 默认的 node-server 预设,Nitro 也能打包到 Cloudflare Pages/Workers、Vercel 等边缘或 Serverless 运行时;如果用 nuxt generate 预渲染成静态站点,就完全不需要服务端运行时。

服务:后端 API(对应问题 2)

Node 渲染页面时调用后端,通常走集群内网直连,比如直接访问 K8s 的 Service 名,不需要再绕回 Nginx。浏览器直接发起的 /api 请求,可以由 Nginx 转发给后端,完全不经过 Node。要不要让 /api 经过 Node,取决于是否需要在 Node 层统一处理鉴权、聚合这类逻辑。

部署:K8s(对应问题 6)

Pod 是 K8s 调度的最小单位,里面可以放一个或多个容器,同一个 Pod 的容器共享网络,所以 Sidecar 模式下 Nginx 能用 127.0.0.1:3000 访问 Node。Deployment 管理一组相同的 Pod,负责副本数量和滚动发布。Pod 会被销毁重建,IP 也随之变化,所以要用 Service 提供稳定的访问地址,并在多个 Pod 之间做负载均衡:ClusterIP 类型只在集群内可达,NodePort 和 LoadBalancer 类型才能对外暴露。Ingress 是集群的 HTTP 入口规则,要配合 Ingress Controller 才会生效。实际部署中更常见的是 Nginx 和 Node 分成两个 Deployment,各自按负载扩缩容;Node 服务还应该配置就绪探针(readinessProbe),保证 SSR 服务启动完成后才开始接收流量。

对照:非 SSR 项目(对应问题 7)

要区分构建和运行两个阶段。无论是不是 SSR,构建都需要 Node,用来安装依赖、执行 Vite 或 Webpack 打包;纯 SPA 的产物只有 index.html 和静态资源,运行时交给 Nginx、CDN 或 Cloudflare Pages 这类静态托管即可,Node 不参与。用 Nginx 托管 SPA 时要配置 try_files $uri $uri/ /index.html,否则刷新前端路由页面会返回 404。判断一个项目运行时需不需要 Node,看产物里有没有服务端入口,比如 server/ 目录或 index.mjs。

1. Nginx 和 CDN 网站比如 Cloudflare 怎么配合部署一个官网网站 ​

将 Nginx 与 Cloudflare 配合部署官网,核心思路是:让 Cloudflare 作为全球流量入口,负责 CDN 加速、DDoS 防护和 SSL 终结;让 Nginx 作为源站服务器,专注处理动态请求、反向代理和精细化的本地控制。两者分工明确,能显著提升网站的性能、安全性和可靠性。

核心架构 ​

用户访问官网时,请求不会直接到达你的服务器,而是先经过 Cloudflare 的全球节点网络。Cloudflare 会处理 SSL 加密、缓存静态资源、过滤恶意流量,然后将“干净”的请求转发给你的 Nginx 源站。

分步部署指南 ​

第一步:配置 Cloudflare DNS 与 SSL

登录 Cloudflare 控制台,为域名添加一条 A 记录,指向你的服务器 IP,并开启 “代理状态”(橙色云朵图标)。然后进入 SSL/TLS → 概述,将加密模式设置为 “完全(严格)”。这一步能确保 Cloudflare 与你的 Nginx 源站之间也是加密的,避免出现 525 等 SSL 握手错误。

第二步:在 Nginx 上安装 Cloudflare Origin 证书

在 Cloudflare 控制台进入 SSL/TLS → 源服务器,点击 “创建证书”。将生成的 Origin Certificate 和 Private Key 保存到 Nginx 服务器(例如 /etc/nginx/ssl/ 目录下)。

第三步:配置 Nginx 支持 HTTPS 与反向代理

一个基础的 Nginx 配置示例如下:

nginx
server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/nginx/ssl/origin.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3000; # 你的官网应用端口
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

第四步:配置 Nginx 获取访客真实 IP(关键)

默认情况下,Nginx 日志里记录的都是 Cloudflare 节点的 IP。你需要启用 realip 模块,让 Nginx 从 Cloudflare 传来的 CF-Connecting-IP 头中获取真实访客 IP:

nginx
http {
    # 信任 Cloudflare 的 IP 段(需定期更新,建议使用自动化工具)
    include /etc/nginx/cloudflare-ips.conf;

    real_ip_header CF-Connecting-IP;
    real_ip_recursive on;
}

第五步:在 Cloudflare 配置缓存规则

Cloudflare 默认只缓存图片、CSS 等静态资源。如果官网有大量静态页面,可以在 规则 → 缓存规则 中新建规则,将 缓存级别 设为 “缓存所有内容”,从而大幅提升页面加载速度。

最佳实践与故障排查 ​

  • 安全加固:在服务器防火墙中,设置仅允许 Cloudflare 官方 IP 段访问 443 端口,防止源站 IP 被直接攻击。
  • 常见错误 525:通常是因为 Cloudflare SSL 模式设为了“完全(严格)”,但 Nginx 没有配置有效的 SSL 证书。请确保 Origin 证书已正确安装。
  • 缓存不生效:检查 Nginx 是否为 HTML 页面设置了 Cache-Control: no-cache 或 private。Cloudflare 会尊重源站的缓存头,如果源站不允许缓存,Cloudflare 也不会缓存。

这套方案能很好地兼顾官网的全球访问速度与源站安全。

2. SSR 项目的业务请求路径会经过 Node、中间件、Nginx 再到后端吗 ​

不一定,取决于你的 SSR 框架、Nginx 路由配置和 API 请求方式。而且常见顺序通常不是“Node → 中间件 → Nginx → 后端”,而是 Nginx 在 Node 前面。

典型 SSR 架构请求路径 ​

text
浏览器
  ↓
Cloudflare / CDN
  ↓
Nginx(入口网关:SSL、缓存、反向代理)
  ├── /api/*  → 后端 API 服务(可能不经过 Node)
  └── /*      → Node SSR 服务
                 ↓
               Node 中间件(鉴权、日志、错误处理等)
                 ↓
               SSR 渲染 / BFF 逻辑
                 ↓
               后端 API(通常内网直连,也可能再经 Nginx)

分情况看 ​

1. SSR 页面请求

浏览器请求页面时:

text
浏览器 → Cloudflare → Nginx → Node SSR → Node 中间件 → 渲染页面

如果渲染过程中需要数据,Node 会再请求后端 API。这个请求通常内网直连后端,不经过 Nginx;但也可以配置成经过 Nginx 网关再转发。

2. 浏览器直接发起的 API 请求

如果 Nginx 配置了 /api 直接转发后端:

text
浏览器 → Cloudflare → Nginx → 后端 API

这时不经过 Node。

如果采用 BFF 模式,所有 API 都先到 Node:

text
浏览器 → Cloudflare → Nginx → Node → Node 中间件 → 后端 API

3. Node 服务端请求后端

SSR 渲染时 Node 作为客户端调后端,常见是:

text
Node → 后端 API(内网直连)

如果为了统一鉴权、负载均衡,也可能:

text
Node → Nginx → 后端 API

但这样多一跳,一般不是首选。

关键点 ​

  • Nginx 通常在 Node 前面,作为入口反向代理。
  • Node 中间件在 Node 内部,位于 Node 收到请求之后、业务逻辑之前。
  • 业务请求不一定经过 Node:/api 可以直接由 Nginx 转发到后端。
  • Node 请求后端也不一定经过 Nginx:通常内网直连更高效。
  • 是否绕 Nginx,完全取决于你的 location 和 proxy_pass 配置。

3. 为什么有时候要加配置,让 SSR 项目的请求经过 Node 中间件呢 ​

核心原因是:让 Node 层不只是做 SSR 渲染,而是承担 BFF(Backend for Frontend)或应用网关的职责。加配置让请求先经过 Node 中间件,是为了复用一套统一的业务逻辑,而不是单纯“多绕一跳”。

常见动机 ​

  1. 统一鉴权与会话管理 页面 SSR 需要用户信息,API 也需要鉴权。如果 /api 直接由 Nginx 转发到后端,每个后端服务都要单独解析 JWT、刷新 Token、处理 Cookie。让请求先到 Node 中间件,可以统一校验、注入用户信息,再转发给后端。

  2. BFF 数据聚合与裁剪 前端一个请求 /api/dashboard,可能需要用户、订单、消息三个后端服务的数据。Nginx 只能做简单转发,无法聚合。Node 中间件可以并行调用多个后端,合并、裁剪后返回给前端。

  3. SSR 渲染前的预处理 SSR 页面渲染前,中间件可以处理国际化、主题、A/B 测试、灰度分流、重定向、设备适配等。这些逻辑放在 Node 里比放在 Nginx 里更灵活。

  4. 安全与限流 在 Node 中间件做 CSRF 防护、限流、IP 黑名单、请求签名、隐藏后端拓扑。后端服务不直接暴露,只信任 Node 层。

  5. 缓存与性能优化 Node 中间件可以做页面级缓存、数据缓存、SSR 缓存,减少后端压力。也可以统一设置缓存头,再交给 Cloudflare 边缘缓存。

  6. 统一日志、错误处理与监控 所有请求经过 Node,可以集中记录请求链路、耗时、错误,方便排查问题。

  7. 动态路由与灰度发布 根据 Cookie、Header、用户标签,把请求分发到不同版本的后端或渲染不同页面。Nginx 配置做复杂动态逻辑很吃力。

配置上的体现 ​

默认 Nginx 可能这样配,API 直接到后端:

nginx
location /api/ {
    proxy_pass http://backend;
}

如果要让 API 也走 Node 中间件,就改成:

nginx
location /api/ {
    proxy_pass http://node_ssr;  # 先到 Node
}

Node 中间件处理完鉴权、聚合、日志后,再内网调用后端。

代价与权衡 ​

  • 增加一跳,延迟略增;
  • Node 成为瓶颈,需要集群和高可用;
  • 复杂度上升,故障点增多。

所以不是所有请求都必须走 Node。纯静态资源、纯透传 API、无需业务逻辑的请求,Nginx 直连后端更高效。只有需要统一鉴权、数据聚合、动态路由、灰度、缓存等能力时,才值得让请求经过 Node 中间件。

一句话总结:加配置让请求经过 Node 中间件,是为了把 Node 当作 BFF/网关,统一处理跨切面逻辑;如果不需要这些逻辑,直连后端更好。

4. 那 Node 层的鉴权、缓存,以及 SSR 预处理、多请求的聚合裁剪都需要开发去做对吧,那这里会用到什么语言,前端可以进行开发吗 ​

是的,这些都需要开发去实现。Nginx/Cloudflare 只能提供转发、缓存、SSL 等基础能力,但“鉴权逻辑、缓存策略、SSR 预处理、多请求聚合裁剪”属于业务/应用层逻辑,必须写代码。

用什么语言? ​

Node 层通常就是 JavaScript / TypeScript,运行在 Node.js 上。常见框架:

  • Next.js:Route Handlers / API Routes / Middleware
  • Nuxt:server routes / server middleware
  • Remix:loader / action
  • NestJS、Express、Koa、Fastify:传统 Node 中间件

所以语言上就是 JS/TS,和前端同一套语言。

前端可以开发吗? ​

可以,而且很常见。 因为前端本来就写 JS/TS,SSR 项目里 Node 层和前端代码往往在同一个仓库。很多公司让前端直接负责 BFF 层。

但要注意:这已经不是纯前端,而是 服务端开发 / BFF 开发 / 全栈开发。前端需要补这些能力:

  • HTTP、Cookie、Session、JWT、OAuth、CSRF
  • Redis、内存缓存、HTTP 缓存头、缓存失效
  • 并发请求、超时、重试、降级、错误处理
  • 安全:XSS、CSRF、越权、限流、防刷
  • 部署、日志、监控、链路追踪、性能优化

各项具体谁来做? ​

能力主要工作前端能否做
鉴权解析 Token、校验 Session、注入用户、RBAC能,但需懂安全
缓存Redis/内存缓存、Cache-Control、失效策略能,但需懂缓存一致性
SSR 预处理i18n、主题、A/B、灰度、重定向、UA 判断前端很擅长
多请求聚合裁剪并行调后端、合并数据、裁剪字段、错误降级能,但需后端思维
中间件日志、鉴权、限流、异常捕获能,属于 Node 开发

团队分工现实情况 ​

  • 小团队:前端全栈,直接写 Node 层。
  • 中大团队:前端写 BFF/SSR 层,后端提供领域 API;或单独有 Node/BFF 团队。
  • 复杂核心业务:鉴权、支付、风控等可能由后端主导,前端只做展示和聚合。

结论 ​

Node 层的鉴权、缓存、SSR 预处理、聚合裁剪,都需要开发写代码,语言是 JS/TS。 前端完全可以开发,尤其是 Next.js/Nuxt 这类全栈框架下,前端写 Node 层很自然。 但简单逻辑前端能直接扛;复杂鉴权、缓存一致性、高并发、安全要求高的部分,最好由具备服务端经验的全栈或后端一起参与。

5. 所以 Nuxt 项目里居然要自己写 Node 层代码吗,那一个 Nuxt 项目打包后,到底是运行在 Node 环境还是 Nginx 服务器上 ​

简单直接地回答:Nuxt 项目打包后,它本身就是一个 Node.js 服务器,需要运行在 Node 环境里。而 Nginx 是运行在这个 Node 服务器前面的“反向代理”。两者是协同工作的关系,不是二选一。

打包后,产物到底是什么? ​

执行 nuxt build 后,会在 .output 目录生成一个 Nitro 服务器(Nuxt 的服务端引擎)。

  • 启动方式:通过 node .output/server/index.mjs 命令启动,默认监听 3000 端口。
  • 运行环境:这个产物必须运行在 Node.js 环境中,它不是一个可以直接扔进 Nginx 的静态文件包。

那 Nginx 在这里扮演什么角色? ​

Nginx 不运行 Nuxt 代码,而是作为高性能入口网关,负责:

  • 反向代理:将用户的公网请求转发给内部 3000 端口的 Node 服务,隐藏应用真实端口。
  • SSL 终结:处理 HTTPS 加密解密,让 Node 服务专注业务逻辑。
  • 静态资源托管:直接高效处理图片、CSS、JS 等静态文件,减轻 Node 压力。

那我还需要自己写 Node 层代码吗? ​

需要,但 Nuxt 已经为你搭好了“脚手架”。

Nuxt 3 的 server/ 目录就是专门写后端逻辑的地方。你不需要从零搭建 Express/Koa 服务器,只需在约定目录下写文件即可,框架会自动加载:

  • 鉴权:在 server/middleware/auth.ts 中写校验逻辑,它会自动拦截所有请求进行身份检查。
  • API 聚合:在 server/api/ 下创建文件,里面可以 await 多个后端接口,合并数据后返回给前端。
  • SSR 预处理:在 server/plugins/ 或中间件里处理 A/B 测试、重定向等逻辑。

总结 ​

一个典型的 Nuxt SSR 项目生产环境部署架构是这样的:

用户请求 → Cloudflare (CDN/防护) → Nginx (反向代理/SSL) → Node/Nitro 服务器 (运行 Nuxt 代码,监听 3000 端口)

所以,你打包出来的产物是一个 Node 应用,需要 Node 环境来运行。Nginx 是部署架构中负责“看门”和“分流”的关键组件,两者缺一不可。

6. Nginx 和项目 Node 服务器是运行在同一个 Pod 中的对吧,然后用户请求的地址是什么样的,Nginx 是怎么接收到 CF 的请求的 ​

不一定在同一个 Pod。Nginx 和 Node 可以同 Pod,也可以不同 Pod,取决于你的 K8s 部署方式。Cloudflare 只负责把请求回源到你的“源站入口”,它并不关心你内部是 Pod 还是虚拟机。

一、Nginx 和 Node 的几种部署关系 ​

1. 同 Pod(Sidecar 模式)

一个 Pod 里两个容器:

  • Nginx 容器:监听 80/443
  • Node 容器:监听 3000

它们共享同一个网络命名空间,所以 Nginx 可以直接:

nginx
proxy_pass http://127.0.0.1:3000;

Pod 对外通过 Service 暴露 Nginx 的端口。CF 回源到 Service 的入口 IP。

2. 不同 Pod(更常见)

  • Nginx 作为独立 Deployment,或多个副本
  • Node 作为另一个 Deployment,多个副本
  • Nginx 通过 K8s Service 名访问 Node:
nginx
proxy_pass http://node-service:3000;

或者 Nginx 本身就是 Ingress Controller,CF 回源到 Ingress,再由 Ingress 路由到 Node Service。

3. 不用 Nginx,只用 Ingress / 网关

也可能 Nginx 的角色被 K8s Ingress、Traefik、Envoy 等替代。

所以,“同 Pod”不是必须,只是其中一种部署选择。

二、用户请求的地址是什么样的? ​

用户看到的永远是:

text
https://www.example.com/some/page

实际网络链路:

text
浏览器
  ↓ DNS 解析 www.example.com
Cloudflare 边缘节点 IP
  ↓ CF 回源
你的源站入口 IP(K8s LoadBalancer / NodePort / Ingress / 公网 IP)
  ↓
Nginx(监听 443)
  ↓
Node/Nuxt(监听 3000)

用户请求的地址是域名,DNS 通常配置成:

  • www.example.com CNAME 到 Cloudflare
  • 或者 A 记录指向 Cloudflare,但开启代理(橙云)

CF 回源时,会根据你的 DNS 记录找到源站 IP。这个源站 IP 可能是:

  • K8s Service 的 External IP
  • 云厂商 LoadBalancer IP
  • NodePort 的节点 IP
  • 直接暴露的 Nginx 公网 IP

三、Nginx 怎么接收到 CF 的请求? ​

CF 收到用户请求后,会作为“客户端”向你的源站发起新的 HTTP/HTTPS 请求。

假设你的源站入口指向 Nginx 的 443 端口:

  1. CF 发起回源连接

    text
    CF 节点 → TCP 连接到 你的源站 IP:443
  2. TLS 握手

    CF 使用 SNI 带上 www.example.com,Nginx 用对应的 Origin 证书完成握手。

  3. 发送 HTTP 请求

    CF 发给 Nginx 的请求大致是:

    http
    GET /some/page HTTP/1.1
    Host: www.example.com
    CF-Connecting-IP: 用户真实 IP
    X-Forwarded-For: 用户真实 IP
    X-Forwarded-Proto: https
  4. Nginx 匹配 server_name

    nginx
    server {
        listen 443 ssl;
        server_name www.example.com;
        location / {
            proxy_pass http://127.0.0.1:3000;
        }
    }
  5. Nginx 转发给 Node

    Node 收到请求,执行 SSR 或 API 逻辑,返回响应。

  6. 响应沿原路返回

    Node → Nginx → CF → 浏览器。

四、Nginx 看到的源 IP 是谁? ​

Nginx 直接看到的 TCP 源 IP 是 Cloudflare 节点的 IP,不是用户真实 IP。

所以要在 Nginx 配置:

nginx
real_ip_header CF-Connecting-IP;
set_real_ip_from 173.245.48.0/20;
# ... 其他 CF IP 段

这样 Nginx 日志和传给 Node 的 X-Forwarded-For 才是真实用户 IP。

五、如果使用 Cloudflare Tunnel ​

也可以不开放源站公网端口:

text
CF 边缘 ← cloudflared 隧道 ← Nginx/Node

这时 Nginx 接收到的请求来自本地的 cloudflared 进程,而不是 CF 节点直接连入。源站 IP 完全隐藏。

六、总结一句话 ​

  • Nginx 和 Node 不一定同 Pod,可以同 Pod 用 localhost,也可以不同 Pod 用 Service 名。
  • 用户请求地址是域名,DNS 指向 Cloudflare。
  • CF 根据回源配置,把请求转发到你的源站入口 IP。
  • Nginx 监听 443,接收 CF 发来的 HTTPS 请求,再反向代理给 Node。
  • Nginx 直接看到的是 CF 节点 IP,真实用户 IP 要从 CF-Connecting-IP 头取。

7. 其他前端项目,如果不是 SSR,是不是就不会运行在 Node 环境中了 ​

对,大多数非 SSR 的前端项目,在生产运行时不需要 Node 环境。它们构建后就是一堆静态文件(HTML、CSS、JS、图片),只需要一个静态文件服务器或 CDN 就能跑。

但要区分两个阶段:

1. 构建阶段:仍然需要 Node ​

无论是不是 SSR,现代前端项目(React、Vue、Vite、Webpack 等)在开发和打包时都需要 Node。因为:

  • 开发服务器(热更新、代理)
  • 打包工具(Vite、Webpack、Rollup)
  • 依赖安装(npm/pnpm/yarn)

所以你的 CI/CD 流水线里会有 Node,但只是为了产出静态文件。

2. 运行阶段:通常不需要 Node ​

打包产物一般是:

text
dist/
  index.html
  assets/
    app.js
    style.css
    logo.png

这些文件可以直接交给:

  • Nginx:最常用,配置 root 指向 dist 目录,try_files 回退到 index.html。
  • CDN / 对象存储:如 Cloudflare Pages、AWS S3 + CloudFront、阿里云 OSS。
  • 静态托管平台:Vercel、Netlify、GitHub Pages。

这时用户请求:

text
浏览器 → Cloudflare → Nginx / CDN → 返回静态文件

Node 完全不参与。

3. 什么情况下非 SSR 项目仍会跑 Node? ​

如果项目里有服务端逻辑,即使页面是 CSR,也可能有 Node 服务:

  • BFF / API 聚合:前端请求先到 Node,Node 调多个后端再返回。
  • API Routes:Next.js/Nuxt 的 API 路由,即使页面静态导出,API 部分仍需 Node 或 Serverless。
  • 鉴权中间件:需要在服务端校验 Token、设置 Cookie。
  • 代理转发:开发环境常用 Node 代理,生产可能用 Nginx 替代。
  • SSG 的增量再生:如 Next.js ISR,需要 Node 运行时按需生成页面。

但这些是额外的后端服务,不是“前端项目本身必须运行在 Node”。

4. 怎么判断? ​

看打包产物:

  • 只有 index.html + assets/ → 不需要 Node 运行时。
  • 有 server/、api/、middleware/、index.mjs 入口 → 需要 Node 或类似运行时。

总结 ​

  • 纯 SPA / 静态站点:生产运行不需要 Node,Nginx 或 CDN 直接托管静态文件。
  • SSR / BFF / API 路由:需要 Node 运行服务端代码。
  • 构建阶段:几乎都需要 Node,但那是构建工具,不是运行时。

所以在 K8s 里,一个纯前端 SPA 通常就是一个 Nginx Pod 或直接由 Ingress 指向静态存储,不需要 Node 容器。

内容均为个人学习与公开总结,不含未脱敏的内部资料。