宝塔需安装官方Node.js插件而非PM2;PM2启动须用绝对路径、填应用名和正确项目路径;域名访问需配反向代理并禁用缓存;日志应重定向避免ENOSPC。

宝塔面板里找不到 Node.js 环境?先确认是否装了正确的插件
宝塔默认不带 Node.js 运行环境,必须手动安装官方 Node.js 插件(不是“PM2”插件,也不是随便搜到的第三方包)。没装这个,后面所有配置都白搭。
常见错误现象:npm 命令报错 command not found,或在网站设置里根本看不到“Node.js”类型选项。
- 登录宝塔后台 → 左侧「软件商店」→ 搜索
Node.js→ 找到官方出品(作者显示「宝塔」)、状态为「已安装」的那个版本 - 如果没装,选一个 LTS 版本(比如
v18.19.1)安装,别选最新非LTS版,容易和某些 npm 包冲突 - 安装完别忘了点「设置」→「环境变量」确认
/www/server/nvm/versions/node/v18.19.1/bin(路径随版本变)已加入系统 PATH
用 PM2 启动项目时进程总退出?检查启动命令和工作目录
宝塔的「PM2管理器」只是个壳,真正起作用的是你填进去的启动命令。写错路径、漏 --name、或没指定 ecosystem.config.js 都会导致守护失败。
使用场景:你有 package.json 里的 "start": "node server.js",但直接填 npm start 在宝塔 PM2 里大概率失败——因为没加载用户级 npm 全局环境。
- 推荐写绝对路径启动命令,例如:
/www/server/nvm/versions/node/v18.19.1/bin/npm start -
应用名称必须填,否则 PM2 无法识别和重启,建议用项目名如my-api -
项目路径必须是项目根目录(含package.json),不是server.js所在目录;填错会导致Cannot find module - 如果用了
ecosystem.config.js,启动命令就该是:/www/server/nvm/versions/node/v18.19.1/bin/pm2 start ecosystem.config.js
域名访问 502 或空白页?反向代理没配对端口
Node.js 项目自己监听 localhost:3000,但宝塔网站默认走 Nginx,不配反向代理,请求根本到不了你的 Node 进程。
错误现象:curl http://127.0.0.1:3000 能返回内容,但浏览器访问域名就 502;或者 Nginx 日志里反复出现 connect() failed (111: Connection refused)。
- 进「网站」→ 点开对应站点 → 「反向代理」→ 添加,目标 URL 填
http://127.0.0.1:3000(端口必须和你 Node 项目实际监听的一致) - 务必关掉「启用缓存」,Node 动态服务开了缓存会返回旧响应
- 如果项目里用了
app.set('trust proxy', 1)或需要真实 IP,记得在反向代理配置里加两行:proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
PM2 日志里一堆 ENOSPC 或内存溢出?别让 PM2 自己管日志
宝塔的 PM2 插件默认把所有输出塞进它自己的日志文件,长期运行后可能占满 inode 或磁盘,更糟的是,它不会自动轮转,pm2 logs 查着查着就卡死。
性能影响:日志文件过大不仅拖慢 PM2,还会让宝塔后台响应变慢,甚至导致「PM2 管理器」页面打不开。
- 在项目根目录新建
ecosystem.config.js,显式关闭内置日志:output: '/dev/null', error: '/dev/null' - 改用项目自身日志方案,比如用
pino写入logs/app.out.log,再配合 Linuxlogrotate定期切割 - 或者最简方案:启动命令末尾加
> /www/wwwroot/myapp/logs/out.log 2>&1,把输出重定向到自定义文件(记得提前mkdir -p logs并chown www:www logs/)
真正的麻烦往往不在部署动作本身,而在路径权限、环境变量继承、以及你以为“自动处理”的日志和代理细节上。多看一眼 pm2 show my-api 里的 status 和 restarts 字段,比反复重装插件有用得多。

















