You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PM2远程部署大型Nuxt应用时如何实现构建阶段零停机?

PM2部署Nuxt应用零停机方案

现有配置问题分析

你当前的配置存在三个核心问题必然导致服务 downtime:

  • 直接在current目录执行构建操作,构建过程中会覆盖正在运行的服务依赖文件,导致服务不可用
  • 用startOrRestart执行重启,会一次性停止所有运行实例再启动,中间存在服务空白期
  • pre-deploy-local直接把.env传到运行中的current目录,若部署中断会损坏现有生产环境配置

可行落地方案

方案1:优化远程部署逻辑(推荐,无需调整构建位置)

PM2的SSH部署功能默认采用版本目录+软链的流转机制,只要正确配置即可完全避免构建影响线上服务:
PM2部署的默认目录结构如下,所有构建操作会在独立的版本目录中执行,构建成功后才会切换线上流量:

/home/ubuntu/frontend/
├── releases/   # 存放历史部署版本,每个版本对应一个时间戳命名的独立目录
├── shared/     # 存放多版本共用文件(如.env、node_modules)
└── current/    # 软链指向当前正在运行的版本目录

修改后的ecosystem.config.js配置:

module.exports = {
  apps: [
    {
      name: 'my-frontend',
      exec_mode: 'cluster',
      instances: 'max',
      script: './node_modules/nuxt/bin/nuxt.js',
      args: 'start',
    }
  ],
  deploy : {
    production : {
      "key": "/home/tobias/.ssh/apis.pem",
      "user": 'ubuntu',
      "host": ['myipaddresshere'],
      "ref": 'origin/master',
      "repo": 'git@github.com:myusername/my-frontend.git',
      "ssh_options": ['ForwardAgent=yes'],
      "path": '/home/ubuntu/frontend',
      "releases": 5, // 保留最近5个版本,方便快速回滚
      // .env传到shared共用目录,不要碰运行中的current目录
      "pre-deploy-local": `scp -i /home/tobias/.ssh/apis.pem /home/tobias/projects/my-frontend/.env ubuntu@myipaddresshere:/home/ubuntu/frontend/shared/.env`,
      // 所有操作在当前部署的独立版本目录执行,构建成功才切软链、滚动重启
      "post-deploy" : 'ln -sf /home/ubuntu/frontend/shared/.env .env && ln -sf /home/ubuntu/frontend/shared/node_modules node_modules && npm install && npm run build && pm2 reload ecosystem.config.js --env production'
    }
  }
}

额外优化操作:

首次部署前先在服务器的shared目录初始化node_modules,避免每次部署全量重装依赖:

ssh -i /home/tobias/.ssh/apis.pem ubuntu@myipaddresshere "mkdir -p /home/ubuntu/frontend/shared && cd /home/ubuntu/frontend/shared && npm init -y"

方案2:本地构建上传(适合服务器配置较低的场景)

如果服务器性能差,构建耗时过长,可以把构建步骤移到本地,构建完成后再上传产物到服务器,修改逻辑如下:

  • 本地pre-deploy-local阶段执行npm run build,将构建后的.nuxt目录、package.json、.env打包后传输到服务器对应版本目录
  • 远程post-deploy阶段不需要再执行构建,直接执行pm2 reload即可

核心注意点

  • 必须用pm2 reload替代startOrRestart:cluster模式下reload是滚动重启,会逐个替换实例,全程有可用实例处理请求,完全零停机
  • 所有部署阶段的修改操作不要触碰正在运行的current目录,必须等构建、依赖安装全部验证通过后再切换流量

内容的提问来源于stack exchange,提问作者Thorvald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:36:03