如何在同一Node.js实例上部署SSR Nuxt与NestJS应用
核心结论
技术上可以在同一个Node.js进程内同时运行SSR模式的Nuxt和NestJS,但生产环境绝对不推荐这么做。
Plesk面板标注的「单域名仅支持一个Node.js实例」,指的是面板可视化配置里只能给域名绑定一个Node启动入口,不是指服务器上只能跑一个Node进程,完全有更稳定的标准生产部署方案绕开这个限制。
同进程部署的缺陷(为什么不推荐生产用)
- 故障完全耦合:任意一方代码抛出未捕获异常,整个Node进程直接崩溃,前端页面和后端API会同时不可用
- 资源争抢:Nuxt SSR属于CPU密集型操作,和NestJS的API逻辑共用同一个事件循环,高峰期两边的响应速度都会被严重拖慢
- 依赖冲突风险高:Nuxt和NestJS的生态依赖如果出现版本不兼容(比如不同版本的RxJS、工具库),同进程部署会直接报运行时错误,排错成本极高
- 无法独立扩容:后续如果需要单独给API或者SSR服务加资源、做集群,同进程架构完全没法拆分
同进程部署的实现方式(仅适合本地测试/个人Demo,禁止生产使用)
核心逻辑是在同一个Node服务内做路径分流:/api前缀的请求交给NestJS处理,其余所有请求交给Nuxt SSR渲染。
- 给NestJS设置全局路由前缀,所有API接口统一走
/api路径,在NestJS入口文件main.ts中添加配置:
app.setGlobalPrefix('api');
- 将Nuxt构建后的产物引入NestJS项目,添加通配符路由接管所有非API请求,核心实现代码:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { loadNuxt } from 'nuxt'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 配置API前缀 app.setGlobalPrefix('api'); // 生产模式加载Nuxt实例 const nuxt = await loadNuxt('start'); // 所有非/api开头的请求转发给Nuxt渲染 app.use(/^(?!\/api).*/, (req, res) => { res.setHeader('Content-Type', 'text/html'); nuxt.render(req, res); }); // 监听端口和Plesk面板配置的端口保持一致 await app.listen(process.env.PORT || 3000); } bootstrap();
- 合并两个项目的
package.json依赖,依次执行Nuxt构建、NestJS构建,把整个项目目录上传到服务器,Plesk面板里Node启动入口指向NestJS编译后的main.js文件即可。
警告:该方案没有任何故障隔离能力,只要业务有正式用户访问,就不要用这个部署方式。
Plesk环境下的标准生产部署方案
这个方案完全符合生产环境稳定性要求,也不需要占用面板分配的多个Node实例配额:
- 分别构建两个项目:Nuxt目录下执行
nuxt build生成SSR产物,NestJS目录下执行nest build生成后端服务产物,两个项目分别存放在服务器的独立目录下 - 用PM2做进程守护:如果服务器没有预装PM2,执行
npm install pm2 -g全局安装,然后分别启动两个服务,绑定不同的本地端口:- 启动NestJS服务:
pm2 start /你的Nest项目路径/dist/main.js --name nest-api --port 3001 - 启动Nuxt SSR服务:
pm2 start /你的Nuxt项目路径/.output/server/index.mjs --name nuxt-ssr --port 3000 - 执行
pm2 save保存进程列表,配置PM2开机自启,保证服务器重启后服务自动恢复
- 启动NestJS服务:
- 配置Nginx反向代理规则:进入Plesk面板对应域名的「Apache与Nginx设置」,添加两条转发规则:
- 所有匹配
/api/*路径的请求,转发到本地3001端口的NestJS服务 - 其余所有路径的请求,转发到本地3000端口的Nuxt SSR服务
- 所有匹配
- 面板里分配的Node.js实例,只需要写一个最简单的返回200状态码的健康检查脚本作为启动入口即可,实际业务流量已经通过Nginx反向代理分发给PM2托管的两个独立服务,完全不受面板单Node实例的限制。
这个方案的优势:
- 前后端服务完全隔离,单个服务崩溃不会影响另一个
- 可以单独重启、更新、扩容前后端服务,不需要停掉整个应用
- 没有同进程的资源争抢、依赖冲突问题,稳定性和性能都符合生产要求
内容的提问来源于stack exchange,提问作者paul321
相关产品推荐
相关产品推荐

