宝塔PM2管理器无法自动识别Vue/React前端项目,必须手动创建ecosystem.config.js指定script路径、args参数及cwd,并在宝塔中填写配置文件路径而非项目路径;生产环境推荐build后用Nginx静态托管。

PM2 在宝塔面板里根本不会自动识别你的前端项目
宝塔自带的「PM2管理器」插件只是个 Web 封装界面,它不解析 package.json,也不运行 npm start 或 npm run serve。你直接填项目路径(比如 /www/wwwroot/my-vue-app),点“添加”,它默认会去找根目录下的 app.js —— 而 Vue/React 项目压根没有这个文件,结果就是启动失败、状态显示“错误”、日志里只有 Error: Cannot find module './app.js'。
真正要跑前端项目,必须显式指定启动命令和入口,且得绕过宝塔界面的“智能猜测”逻辑。
必须用 ecosystem.config.js 手动定义启动方式
宝塔的 PM2 管理器底层调用的是 pm2 start,但它只认你传进去的配置文件,不支持在界面上填“启动脚本参数”。所以你要在项目根目录手动创建 ecosystem.config.js,内容类似:
module.exports = {
apps: [{
name: 'my-vue-app',
script: './node_modules/.bin/vue-cli-service',
args: 'serve --mode production --host 0.0.0.0 --port 8080',
cwd: '/www/wwwroot/my-vue-app',
env: {
NODE_ENV: 'production',
PORT: '8080'
},
watch: false,
ignore_watch: ['node_modules', 'logs'],
error_file: '/www/wwwroot/my-vue-app/logs/error.log',
out_file: '/www/wwwroot/my-vue-app/logs/out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss'
}]
};
-
script必须写绝对路径或./node_modules/.bin/xxx,不能只写vue-cli-service(否则 PM2 找不到) -
args里加--host 0.0.0.0,否则默认只监听localhost,外部访问不了 -
cwd必须设成项目路径,否则vue-cli-service启动时读不到vue.config.js或public目录 - 别开
watch:前端 dev server 本身已有热重载,PM2 的文件监听反而会导致重复 reload 和内存泄漏
宝塔界面添加时,“项目路径”填的是配置文件位置,不是源码路径
在宝塔 PM2 管理器点“添加项目”,填的 项目路径 应该是 /www/wwwroot/my-vue-app/ecosystem.config.js,而不是 /www/wwwroot/my-vue-app。否则宝塔会忽略你的配置,强行按默认规则找 app.js。
立即学习“前端免费学习笔记(深入)”;
另外注意:
- “项目名称”可以随便填,但建议和
ecosystem.config.js里的name一致,方便排查 - “运行用户”选你部署项目的用户(比如
www),别用root,否则可能因权限问题读不到node_modules - 添加后如果状态是灰色或“stopped”,立刻去“日志”页看输出 —— 90% 是
cwd错了、script路径不对、或vue-cli-service没安装
生产环境更推荐 build + Nginx 静态托管,而非 serve 长期运行
vue-cli-service serve 是开发服务器,用了 webpack-dev-server,带热更新、sourcemap、模块代理等调试功能,不适合长期挂在线上。它内存占用高、没做安全加固、不支持 HTTP/2、也难配 HTTPS。
正确做法是:
- 本地或构建机执行
npm run build,生成dist/目录 - 把
dist/整个上传到宝塔站点根目录(如/www/wwwroot/my-vue-app/dist) - 在宝塔网站设置里,把“网站目录”指向
/www/wwwroot/my-vue-app/dist,并开启“强制 HTTPS”和“Gzip” - 删掉 PM2 里那个
serve进程 —— 它真没必要活在生产环境
只有当你必须用前端路由(如 Vue Router history 模式)又不想改 Nginx 配置时,才考虑用 serve;但这时务必在 args 里加上 --history-api-fallback,否则刷新 404。

















