运行多Node应用的Ubuntu18服务器如何升级Node不影响现有应用
无侵入多版本隔离方案(零影响现有业务)
直接全局升级系统Node是风险最高的做法,v15到更高版本存在大量API变更、原生模块ABI不兼容问题,大概率会导致现有pm2托管的应用启动失败。正确的做法是完全不触碰现有系统级安装的v15.3.0,通过用户级多版本管理+pm2单应用解释器配置实现版本隔离,全程不需要重启现有在线应用。
操作步骤
1. 安装用户级nvm,不修改系统全局环境
nvm默认安装在当前用户的家目录下,不会覆盖/usr/local/bin、/usr/bin下的原有Node二进制,安装完成后系统默认的node命令依然指向原有v15.3.0,现有运行中的应用完全无感知。
执行安装命令:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc
执行nvm -v输出版本号即安装成功。
2. 安装新应用所需的高版本Node
将命令中的版本号替换为新应用实际要求的版本即可:
# 示例安装Node 20.12.2,按需替换版本号 nvm install 20.12.2
安装完成后查询该版本Node的绝对路径,后续配置pm2需要用到:
# 示例输出:/home/ops/.nvm/versions/node/v20.12.2/bin/node nvm which 20.12.2
3. 单独为新应用指定高版本Node启动
pm2支持为单个应用指定启动解释器路径,不需要全局切换Node版本,现有所有online状态的应用不需要做任何修改、不需要重启,会持续用原有v15.3.0运行。
两种配置方式选其一即可:
- 命令行直接启动:
pm2 start 新应用入口文件.js --interpreter 上一步查到的高版本Node绝对路径 --name 自定义新应用名
- 通过ecosystem配置文件启动:
在新应用对应的配置项中单独添加interpreter字段,原有应用的配置保持不动:
module.exports = { apps: [ // 原有应用配置无需任何修改,默认使用系统v15.3.0 { name: "旧业务A", script: "./old-app/index.js" }, // 新应用单独指定高版本Node { name: "新业务", script: "./new-app/index.js", interpreter: "/home/ops/.nvm/versions/node/v20.12.2/bin/node" } ] }
4. 验证状态
启动新应用后执行pm2 list确认所有应用状态均为online,可通过日志进一步确认版本正确性:
# 查看新应用启动日志,确认运行在要求的高版本Node上 pm2 logs 新应用名 --lines 20 # 抽查旧应用日志,确认无异常、运行版本仍为v15.3.0 pm2 logs 旧业务A --lines 20
避坑提醒
- 不要执行
nvm alias default 高版本号修改默认Node版本,保持系统默认Node为原有v15.3.0,避免后续操作误影响存量业务 - 不要卸载、覆盖系统原有安装的v15.3.0,存量应用的依赖、原生C++模块都是基于该版本编译,修改后会直接导致服务崩溃
- 后续如果需要给存量应用升级Node版本,单独修改对应应用的interpreter配置、重启单个应用即可,不要做全局版本切换
内容的提问来源于stack exchange,提问作者Álvaro
相关产品推荐
相关产品推荐

