宝塔面板默认不提供Node.js环境,需手动用nvm安装;PM2管理器仅是GUI外壳,依赖已安装的Node.js和package.json中的start脚本;不支持ecosystem.config.js及集群模式;进程异常多因OOM、权限或systemd冲突。
宝塔面板里没有Node.js运行环境选项,得手动安装
宝塔官方应用商店的「Node.js」插件早已下架,当前版本(如 8.0+)默认不提供 Node.js 运行环境。你看到的「PM2管理器」插件只是个可视化外壳,它本身不带 Node.js,也不自动安装 Node.js —— 如果没提前装好 Node.js,点「一键部署」会直接报错
或
。
实操建议:
先通过宝塔终端或 SSH 手动安装 Node.js(推荐用
,方便切换版本):
验证是否生效:
和
必须能正常输出版本号
再全局安装 PM2:
(注意:不要用
除非真遇到依赖冲突)
最后再去宝塔软件商店安装「PM2管理器」插件(它只负责读取
状态并展示进程)
PM2管理器「一键部署」只认 package.json 的 start 脚本
点击「一键部署」后,插件实际执行的是
,也就是说它完全依赖项目根目录下的
中是否有合法的
字段。如果写成
、
或直接用
启动,它不会识别,部署会卡在「启动中」或报错
。
实操建议:
确保
里有明确的
脚本,例如:
路径必须可执行:比如
文件要有可执行权限(
),且首行含
避免在
脚本里加
或
参数——PM2 不是开发工具,热重载会干扰守护行为
如果要用特定环境变量(如
),改用
,别指望插件界面里填的「环境变量」字段能透传给 npm
PM2管理器不支持多实例、集群模式或自定义 ecosystem.config.js
宝塔的 PM2 管理器本质是调用
、
、
等基础命令的 GUI 封装,它不解析也不加载
,也不能设置
、
或
。你手动写的配置文件,它视而不见;你在界面上点「重启」,它只会按原
命令拉起单个进程。
实操建议:
需要集群部署?别依赖界面,SSH 进去手动跑:
想让 PM2 自动加载
,就别用「一键部署」,改用「添加进程」→「指定脚本」→ 填
路径(但注意:宝塔插件仍不会读取其中的
配置,只当它是启动入口)
日志查看别只刷宝塔界面:实际日志在
下,
更实时,
才清缓存
Node.js 进程被杀常见原因:内存超限、用户权限、systemd 冲突
即使部署成功,过几小时发现进程消失,
显示
或
,大概率不是代码问题,而是系统层干预。宝塔运行在 CentOS/Ubuntu 上,常因以下原因静默 kill 掉 Node 进程:
Linux OOM Killer 触发:Node 应用内存暴涨(尤其未设
),系统直接干掉高内存进程 —— 查
宝塔后台定时任务清理「非宝塔启动」进程:如果你用
手动启的,但没用宝塔插件「添加」,它可能被当成“异常进程”回收
systemd 服务冲突:某些云厂商镜像自带
service,和用户级
抢资源,
可查
宝塔面板升级后重置环境变量:PATH 丢失导致
找不到,此时需在
补全
,再
重装启动脚本
真正稳定的部署,从来不是点几下鼠标完成的;那些没显式报错的进程消失,往往卡在系统底层和环境变量之间。
command not found: nodepm2: command not foundnvmcurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 18.18.2
nvm use 18.18.2node -vnpm -vnpm install -g pm2--legacy-peer-deps~/.pm2pm2 start npm --name "xxx" -- startpackage.json"scripts": {"start": "..."}"dev""server"node app.jsnpm ERR! missing script: startpackage.jsonstart"scripts": {
"start": "node ./bin/www"
}./bin/wwwchmod +x ./bin/www#!/usr/bin/env nodestartnodemon--watchNODE_ENV=production"start": "NODE_ENV=production node ./app.js"pm2 listpm2 showpm2 restartecosystem.config.jsinstancesexec_mode: 'cluster'watch: truestartpm2 start ecosystem.config.jsecosystem.config.jsecosystem.config.jsapps~/.pm2/logs/pm2 logspm2 flushpm2 statuserroredoffline--max-old-space-sizedmesg -T | grep -i "killed process"pm2 startpm2-rootpm2systemctl status pm2-rootnode~/.bashrcexport PATH=$HOME/.nvm/versions/node/v18.18.2/bin:$PATHpm2 startup