宝塔面板安装node.js应使用“node.js项目管理器”插件并勾选“为所有用户启用node.js命令”,安装后需执行source命令验证环境变量,pm2启动须指定nvm路径下的二进制文件并确保权限与用户一致。

宝塔面板里装 Node.js,别直接点“一键部署”
宝塔自带的 Node.js 管理器(v7.0+)本质是封装了 nvm,但默认安装路径、权限和环境变量常被忽略,导致后续 PM2 启动失败或找不到 node 命令。
实操建议:
- 进「软件商店」→ 搜索「Node.js 项目管理器」→ 安装最新稳定版(非「Node.js 运行环境」那个旧插件)
- 安装时勾选「为所有用户启用 Node.js 命令」——这步决定终端里能否直接用
node和npm - 装完立刻在终端执行
source /www/server/nvm/nvm.sh && node -v验证是否生效;如果报错command not found,说明环境变量没加载,需手动追加到/etc/profile
PM2 启动报错 “cannot find module” 或 “permission denied”
常见现象是 PM2 能启动,但日志里反复提示找不到 express、koa,或者卡在 EACCES 权限错误。根本原因不是代码问题,而是 PM2 进程没继承宝塔设置的 Node.js 环境。
实操建议:
- 不要用宝塔「进程管理」里直接添加 PM2 服务——它默认用系统全局
node,而非 nvm 切换的版本 - 改用命令行启动,并显式指定执行路径:
cd /www/wwwroot/myapp && /www/server/nvm/versions/node/v18.18.2/bin/pm2 start app.js --name myapp - 确保
app.js文件权限为 644,所在目录属主是www用户(宝塔默认运行用户),否则 PM2 以root启动会因权限过高被拒绝写日志
用宝塔定时任务拉取代码后,PM2 自动重载不生效
很多人配了 Git 拉取 + PM2 reload 的定时脚本,但发现代码更新了,服务却还是旧的。这是因为 PM2 的 reload 依赖文件监听或进程信号,而宝塔定时任务默认以 root 身份执行,和 PM2 实际运行的用户(通常是 www)不一致。
实操建议:
- 定时任务命令前加
sudo -u www:例如sudo -u www /www/server/nvm/versions/node/v18.18.2/bin/pm2 reload myapp - 避免用
restart,改用reload——它支持零停机,且只重启有变更的实例 - 检查 PM2 是否启用了
--watch模式:若本地开发习惯加了这个参数,上线后反而可能因文件变动频繁触发误重载,生产环境建议关掉
Node.js 版本切换后,PM2 列表里进程状态变成 “errored”
在宝塔界面点「切换 Node.js 版本」后,原来用旧版本启动的 PM2 进程不会自动迁移,pm2 list 里显示 errored,但 pm2 show 又看不出具体错误——其实是底层 node 解释器路径变了,老进程还在找已卸载的二进制。
实操建议:
- 切版本前先执行
pm2 stop all,再切换;切完立即用新路径的pm2重新启动:/www/server/nvm/versions/node/v20.10.0/bin/pm2 start app.js - 别依赖宝塔界面上的「重启」按钮——它调用的是封装脚本,有时会漏传
env参数,导致NODE_ENV=production丢失 - 长期运行的服务,建议把启动命令固化成 shell 脚本(如
/www/wwwroot/myapp/start.sh),并用chmod +x加执行权限,方便复用和排查
最麻烦的不是装不上,而是装上了但 PM2 启动时用的不是你认为的那个 Node.js 版本——每次切版本、重装、甚至只是更新宝塔插件,都得手动确认 which node 和 pm2 env 输出是否一致。










