宝塔部署 Node.js 项目:PM2 守护与 Next.js 实战
把 Node.js 项目部署到服务器上,最怕的就是进程一退出、网站就跟着挂掉。宝塔面板的做法是让 Node 项目默认走 PM2 守护进程:进程异常退出会自动重启,不用你自己守在终端前面。部署的核心路径就一条——网站 → Node 项目 → 添加项目,填好启动文件和端口就能跑起来;Next.js 项目多一步「先构建再启动」。
宝塔里部署 Node 项目,PM2 到底做了什么
PM2 是一个 Node 进程管理器,作用是守护进程:应用崩溃、异常退出时自动把它拉起来,让服务持续运行。宝塔面板的 Node 项目管理内置了 PM2,你不需要单独安装 PM2,直接在面板里添加项目即可,面板会负责启动和守护。
官方文档给出的完整流程是:下载/上传源码 → 创建数据库(如需要)→ 添加 PM2 项目 → 配置域名和反向代理。下面按这个顺序走一遍。
第一步:把源码放到服务器上
源码可以用 Git 克隆,也可以打包上传到面板的文件管理里。用 Git 的方式:
git clone https://gitee.com/chancms/ChanCMS.git
克隆后项目会落在对应目录(如 /www/wwwroot/ChanCMS),后面配置运行目录时用绝对路径指向它即可。
第二步:项目需要数据库就先建库
如果项目依赖 MySQL,先在宝塔面板里创建好对应的数据库,拿到数据库名、用户名和密码,这些信息后面要填进项目的环境变量里。
第三步:添加 PM2 项目,两种方式选一种
进面板 网站 → Node 项目,点 添加 Node 项目。启动方式官方给了两种:
方式一:直接用启动文件。适合简单项目,填入口文件(如 app.js)就能启动。
方式二:用 ecosystem.config.cjs 配置文件(推荐)。把进程名、入口文件、运行目录、环境变量、性能参数都写进一个配置文件,维护和切换环境更方便。

ecosystem.config.cjs 里几个关键配置项
| 配置项 | 作用 |
|---|---|
| name | 进程名,pm2 start/stop/restart 时用它,建议与项目名一致 |
| script | 入口文件,一般是 server.js 或 app.js |
| cwd | 项目运行目录,用绝对路径兼容性更好 |
| env | 环境变量,统一管理 |
| instances / exec_mode | 性能优化相关:实例数与执行模式 |
一个精简版配置文件长这样(官方完整示例见文末来源文档):
module.exports = {
apps: [
{
name: "ChanCMS", // 进程名
script: "./app.js", // 入口文件
cwd: "/www/wwwroot/ChanCMS", // 运行目录,绝对路径
exec_mode: "cluster", // cluster 多进程 / fork 单进程
instances: "max", // 实例数,自动适配 CPU 核心数
env: {
NODE_ENV: "production",
PORT: 3000,
},
autorestart: true, // 异常退出自动重启
restart_delay: 5000, // 重启延迟 5 秒
max_memory_restart: "1G", // 内存超 1G 自动重启
watch: false, // 生产环境关闭文件监听
},
],
};
两个关键点:exec_mode: "cluster" 是多进程模式,通过多进程共享端口充分利用 CPU 核心,生产环境推荐(实例数建议不超过 CPU 核心数);autorestart: true 让进程异常退出时自动重启,max_memory_restart 则防止内存泄漏把服务器拖垮。
第四步:启动并确认守护生效
配置好启动方式后提交,面板会启动项目。回到 Node 项目列表,能看到项目的运行状态:

进程进入运行状态后,它就由 PM2 守护了——即使进程意外退出,也会按配置自动重启,不再依赖终端。
第五步:配置域名和反向代理对外发布
应用跑在内网端口上(如 3000),要对外提供访问,就在面板里给站点配置域名和 Nginx 反向代理,把域名请求转发到应用端口。这样用户通过域名访问时,实际请求被转发到 Node 应用。
Next.js 项目怎么部署(多一步构建)
Next.js 项目走的是同一条 Node 项目链路,区别在于先构建、再启动,并且启动文件指向 Next 的二进制。完整流程如下。
环境要求
官方文档给出的版本要求:
| 环境组件 | 版本要求 |
|---|---|
| 宝塔面板 | 11.0+ |
| Node.js 版本管理器 | 2.7+ |
| Node.js | v14.17.6+(推荐 v18 LTS) |
| Nginx | 1.20+ |
| MySQL(如需数据库) | 5.7+ / 8.0+ |
先到 软件商店 搜索并安装 Node 版本管理器,在管理器里装好需要的 Node 版本,再到 网站 → Node 项目 里设置命令行使用的 Node 版本。
上传并解压项目
把项目压缩包上传到 /www/wwwroot/ 目录,右键解压。项目需要数据库时,先在面板里创建数据库并导入 SQL 文件,再改项目里的数据库连接配置。
构建项目
在终端(或 SSH)切到项目目录,先装依赖再构建:
cd /www/wwwroot/your-project-name
npm install
npm run build
构建是 Next.js 部署必须的一步——它会把页面预编译好,npm start 才能直接跑。
添加 Node 项目并启动
进 网站 → Node 项目 → 添加 Node 项目,重点填这几项:
| 配置项 | 说明 |
|---|---|
| 项目名称 | 自定义,如 my-nextjs-app |
| 项目路径 | 项目所在目录,如 /www/wwwroot/your-project-name |
| 启动文件 | node_modules/next/dist/bin/next |
| 启动命令 | start -p 3000 |
| 端口 | 3000 |
| Node 版本 | 选择已安装的版本,如 v18 |

这里的启动文件是 Next.js 的二进制路径,不是普通的 app.js——这是 Next.js 和普通 Node 项目最大的区别。提交后面板会自动启动项目,此时可以通过 http://您的服务器IP:3000 测试,页面正常显示就说明部署成功。
用域名访问(外网映射)
不想带端口号访问,就在 Node 项目列表点该项目的 设置 → 外网映射 → 开启,配置映射规则:域名 填你的域名(可选),外网端口 填 80(HTTP)或 443(HTTPS),内网端口 填应用运行端口 3000。保存后即可直接通过域名访问。
一句话总结
宝塔部署 Node 项目的核心顺序:网站 → Node 项目 → 添加项目 → 填启动文件和端口 → 启动,面板默认用 PM2 守护进程,异常退出自动重启。普通项目填 app.js 即可;Next.js 项目先 npm install + npm run build 构建,再填启动文件 node_modules/next/dist/bin/next、启动命令 start -p 3000,最后开外网映射用域名访问。
信息来源
本文事实以宝塔官方文档为准:《Node.js PM2 部署》、《Next.js 项目部署教程》。
常见问题
Node 项目部署后一退出终端就停了怎么办?
用宝塔的 Node 项目来跑,面板默认用 PM2 作为守护进程:进程异常退出会自动重启,不依赖你的终端是否开着,适合长期运行的生产环境。
PM2 用启动文件启动,还是用 ecosystem.config.cjs 配置文件?
官方推荐用 ecosystem.config.cjs 配置文件:它把进程名、入口文件、运行目录、环境变量、实例数等集中管理,方便维护和切换环境。只用启动文件的方式更简单,但可配置项少。
Next.js 项目的启动文件和启动命令填什么?
启动文件填 node_modules/next/dist/bin/next,启动命令填 start -p 3000,端口填 3000。部署前要先 npm install 安装依赖、npm run build 构建项目。
项目跑在 3000 端口,怎么用域名访问而不带端口号?
在 Node 项目的设置里开启「外网映射」:外网端口填 80(HTTP)或 443(HTTPS),内网端口填应用运行端口 3000,域名按需填写,保存后即可直接通过域名访问。
cluster 和 fork 模式怎么选?
cluster 是多进程模式,通过多进程共享端口充分利用 CPU 核心、提升并发,生产环境推荐;fork 是单进程模式,适合开发环境或单核服务器。