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










