服务端渲染(SSR)在很多中大型前端项目里已经很常见。页面在服务端先生成 HTML 再返回浏览器,首屏通常更快,搜索引擎也更容易读到内容。部署到阿里云时,计算资源、带宽、系统镜像和监控要一起考虑,漏掉任何一项,上线后都容易出问题。

SSR 适合哪些项目
并非每个项目都需要 SSR。内容站(资讯、博客、电商商品详情页)依赖搜索引擎带来流量,基本值得做。营销页面对首屏速度敏感,也适合用 SSR。面向低端设备和弱网用户的应用,服务端先出页面,能减轻客户端的计算压力。后台管理系统一般用纯客户端渲染(CSR)就够,维护成本低。
选型前先问两件事:页面是否依赖实时数据,流量峰值有多高。实时数据多、峰值不稳定,部署形态会偏向弹性方案。数据基本静态、流量平稳,一台 ECS 通常就够用。
阿里云上的三种部署方式
ECS 加 PM2
这是最直接的做法。在 ECS 上装 Node.js,用 PM2 守护进程,前面挂 SLB 做负载均衡。环境完全自己定,调试也方便。代价是扩缩容和系统补丁都要自己处理。流量稳定、团队有运维经验的项目,用这个方案比较踏实。
函数计算 FC
把渲染逻辑部署成 HTTP 触发的函数,通过 API 网关对外提供服务。按调用次数和执行时长计费,夜间流量很低时成本接近于零。需要注意冷启动:长时间没有请求后,第一次访问的延迟会明显变高。对首屏敏感的页面,可以给函数配置预留实例,预留部分要额外付费。
ACK 或 SAE
把应用打成 Docker 镜像,部署到容器服务 ACK,或者用 Serverless 应用引擎 SAE。按 CPU 或 QPS 设置弹性伸缩规则,大促和热点事件期间会自动加实例。运维门槛比函数计算高,但高并发下表现更稳,适合业务量大、服务较多的团队。
带宽和系统镜像怎么配
ECS 的公网带宽有两种计费方式:按固定带宽,或按使用流量。流量稳定且规模较大时,按固定带宽的账单更好预测。流量忽高忽低时,按使用流量更省。选之前,先看监控里过去一个月的出网峰值,再在峰值基础上留一些余量。
带宽压力通常不在 SSR 返回的 HTML 上。HTML 体积一般不大,真正占流量的是图片、JS 和 CSS。把静态资源放到 OSS 并接入 CDN,ECS 的出网压力会小很多,带宽也能买得更小。
系统镜像建议选阿里云 Linux 或 Ubuntu LTS 这类长期维护的版本。镜像里的 Node.js 版本要和本地开发、CI 构建用的版本保持一致,否则带原生模块的依赖,例如用 node-gyp 编译的包,线上可能直接报错。环境配好后,把这台机器做成自定义镜像,之后扩容直接用,新机器不用重新装环境。
一个迁移案例
以一个内容资讯站为例。该站原本是纯 CSR 架构,搜索引擎收录率偏低,移动端首屏加载超过 3 秒。团队把 Nuxt 切换到 SSR 模式,部署在阿里云 ECS 上,前面接 SLB 和 CDN。
迁移分三步走。第一步,只把文章详情页和列表页改成服务端渲染,其余页面保持 CSR,改动范围小,出问题也好排查。第二步,静态资源和不常变的页面走 CDN,并设置合理的缓存头。第三步,接入阿里云 ARMS 监控,盯住渲染耗时和错误率。
上线后,团队主要看三个指标:首屏时间、服务端渲染耗时和搜索引擎收录量。收录变化通常要几周才会体现在搜索数据里,头一两周的数据不足以下结论。
性能优化的几个方向
SSR 变慢,多半慢在服务端渲染本身,而不是网络。可以从下面几处查起。
- 页面级缓存:对不依赖登录状态的页面,在 CDN 或应用层缓存渲染结果,设几十秒到几分钟的短缓存。文章页可以接受短时间的内容延迟,个人中心页则不能缓存。
- 组件按需渲染:把首屏看不到的组件,例如评论区、推荐栏,放到客户端加载,服务端的计算量会少很多。
- 数据请求并行化:渲染时如果串行请求多个接口,总耗时等于各接口耗时相加。改成并行请求,或在网关层聚合成一个接口。
- Node.js 版本与内存:使用长期支持版本。根据监控里的内存曲线和 GC 次数调整实例规格,不要只凭经验配置。
上线前后容易踩的坑
服务端和客户端的数据不一致,是最常见的问题。服务端渲染时拿到的数据,和浏览器做 hydration 时拿到的数据如果不同,页面会报错或闪动。统一数据来源,把首屏数据在服务端序列化进页面,客户端直接读取,不再重复请求。
内存泄漏也很常见。SSR 进程长期运行,全局变量或本地缓存如果没有上限,内存会一点点涨,最后被系统杀掉。给缓存加过期时间和大小上限,配置内存告警,并定期做压力测试。
安全配置不能拖到最后。SSR 服务一般直接暴露在公网,前面要部署 WAF,管理接口只允许内网或指定 IP 访问。数据库密码、密钥这类敏感配置放进 KMS 或环境变量,不要写进代码仓库。
怎么选
没有通用答案。流量稳定、需要自己控制环境,选 ECS 加 PM2。流量起伏大、想压低闲置成本,选函数计算。大促多、并发高,选 ACK 或 SAE。选定之后,先按监控数据跑一段时间,再调整带宽和实例规格,这比一开始就追求完美架构更省钱。