一、什么是 PM2?
在 Node.js 项目上线部署时,我们通常会遇到这些问题:
- 服务异常崩溃后,如何自动重启?
- 服务器重启后,Node.js 服务如何自动启动?
- 如何查看服务运行状态、CPU、内存占用?
- 如何管理多个 Node.js 服务?
- 如何实现日志管理?
- 如何利用多核 CPU 提升服务性能?
如果直接使用下面这种方式启动 Node.js 服务:
bash
node app.js
一旦终端关闭、进程崩溃或者服务器重启,服务就会停止。
PM2 就是为了解决这些问题而出现的。
PM2 是一个用于 Node.js 应用的生产级进程管理工具,官方定位是 Advanced Production Process Manager for Node.js。它可以让 Node.js 应用保持长期运行,并提供自动重启、日志管理、性能监控、集群模式、开机自启等能力。PM2 官方文档也明确说明,它是一个守护进程管理器,可以帮助应用保持在线运行。
二、PM2 适合哪些场景?
PM2 非常适合以下场景:
- Node.js 后端服务部署
- Express、Koa、NestJS 项目部署
- Nuxt、Next.js 服务端渲染项目部署
- WebSocket 服务部署
- 定时任务服务部署
- 内网工具、管理后台、接口服务长期运行
- 多个 Node.js 服务统一管理
简单来说,只要你的服务需要长期稳定运行,就可以考虑使用 PM2。
三、PM2 的核心功能
| 功能 | 说明 |
|---|---|
| 进程守护 | 服务崩溃后自动重启 |
| 日志管理 | 查看 stdout、error 日志 |
| 开机自启 | 服务器重启后自动恢复服务 |
| 多进程管理 | 同时管理多个 Node.js 服务 |
| 集群模式 | 利用多核 CPU,提高并发能力 |
| 状态监控 | 查看 CPU、内存、运行时间 |
| 零停机重载 | reload 时尽量不中断服务 |
| 配置文件管理 | 使用 ecosystem.config.js 管理服务 |
PM2 支持内置负载均衡和 Cluster 模式,启动时可以通过 -i max 使用多核 CPU。
四、安装 PM2
PM2 可以通过 npm 或 yarn 安装,官方推荐安装最新版本:
bash
# npm 安装
npm install pm2@latest -g
# yarn 安装
yarn global add pm2
安装完成后,查看版本与帮助:
bash
# 查看版本
pm2 -v
# 查看帮助信息
pm2 --help
五、准备一个 Node.js 示例项目
新建简单 Node.js 服务 app.js:
javascript
// app.js
const http = require('http');
const PORT = 3000;
const server = http.createServer((req, res) => {
res.end('Hello PM2');
});
server.listen(PORT, () => {
console.log(`Server is running at http://localhost:${PORT}`);
});
普通启动方式:
bash
node app.js
生产环境推荐使用 PM2 托管启动。
六、使用 PM2 启动项目
1. 基础启动
bash
pm2 start app.js
查看进程列表/状态:
bash
pm2 list
# 等价命令
pm2 status
2. 指定应用名称
自定义应用名,方便后续管理:
bash
pm2 start app.js --name my-node-app
3. 停止服务
bash
# 按应用名停止
pm2 stop my-node-app
# 按进程 id 停止
pm2 stop 0
4. 重启服务
bash
pm2 restart my-node-app
5. 删除服务
bash
# 删除指定应用
pm2 delete my-node-app
# 删除所有服务
pm2 delete all
七、PM2 常用命令总结
| 命令 | 说明 |
|---|---|
| pm2 start app.js | 启动应用 |
| pm2 start app.js --name app-name | 指定名称启动 |
| pm2 list | 查看应用列表 |
| pm2 status | 查看应用状态 |
| pm2 stop app-name | 停止应用 |
| pm2 restart app-name | 重启应用 |
| pm2 reload app-name | 平滑重载应用 |
| pm2 delete app-name | 删除应用 |
| pm2 logs | 查看所有日志 |
| pm2 logs app-name | 查看指定应用日志 |
| pm2 monit | 打开监控面板 |
| pm2 info app-name | 查看应用详情 |
| pm2 save | 保存当前进程列表 |
| pm2 startup | 配置开机自启 |
八、查看日志
PM2 日志默认存放路径:$HOME/.pm2/logs
bash
# 查看所有应用日志
pm2 logs
# 查看指定应用日志
pm2 logs my-node-app
# 只查看最新100行日志
pm2 logs my-node-app --lines 100
# 清空所有日志
pm2 flush
# 查看日志文件目录
ls ~/.pm2/logs
日志文件说明:
out.log:标准输出日志error.log:错误日志
九、使用 PM2 监控服务
打开终端可视化监控面板:
bash
pm2 monit
可实时查看:CPU 使用率、内存占用、日志输出、进程状态、请求变化。
简易查看状态:
bash
pm2 list
# 查看应用详细信息
pm2 info my-node-app
十、使用配置文件管理项目
项目较多时,推荐用 ecosystem.config.js 配置文件统一管理。
生成配置文件
bash
pm2 init simple
默认配置示例:
javascript
// ecosystem.config.js
module.exports = {
apps: [
{
name: 'my-node-app',
script: './app.js',
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '300M',
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 3000
}
}
]
};
启动配置文件
bash
# 默认环境启动
pm2 start ecosystem.config.js
# 指定生产环境启动
pm2 start ecosystem.config.js --env production
十一、配置文件字段说明
| 字段 | 说明 |
|---|---|
| name | 应用名称 |
| script | 启动入口文件 |
| instances | 启动实例数量 |
| autorestart | 是否自动重启 |
| watch | 是否监听文件变化 |
| max_memory_restart | 内存超限自动重启阈值 |
| env | 默认环境变量 |
| env_production | 生产环境变量 |
生产级配置示例:
javascript
module.exports = {
apps: [
{
name: 'api-server',
script: './dist/main.js',
instances: 2,
exec_mode: 'cluster',
autorestart: true,
watch: false,
max_memory_restart: '500M',
env_production: {
NODE_ENV: 'production',
PORT: 8080
}
}
]
};
十二、PM2 集群模式
Node.js 默认单进程,无法利用多核 CPU,PM2 集群模式可多实例负载均衡。
命令行启动集群
bash
# 根据CPU核心数自动拉起最大实例
pm2 start app.js -i max
# 固定启动2个实例
pm2 start app.js -i 2
# 带应用名集群启动
pm2 start app.js --name my-node-app -i max
配置文件开启集群
javascript
module.exports = {
apps: [
{
name: 'my-node-app',
script: './app.js',
instances: 'max',
exec_mode: 'cluster'
}
]
};
集群模式适用于:HTTP、WebSocket、接口服务等场景,自动共享端口连接。
十三、reload 和 restart 的区别
| 命令 | 说明 |
|---|---|
| restart | 强制杀死进程再重启,有服务中断 |
| reload | 平滑重载,集群模式下实现零停机更新 |
生产环境 Cluster 模式优先使用:
bash
pm2 reload my-node-app
十四、配置开机自启
1. 生成自启脚本
bash
pm2 startup
按终端提示复制执行 sudo 命令(以服务器输出为准)。
2. 保存当前进程列表
bash
pm2 save
3. 测试生效
bash
# 重启服务器
sudo reboot
# 重启后查看应用是否自动运行
pm2 list
十五、部署 Node.js 项目通用流程
首次部署
bash
# 1. 拉取代码
git pull
# 2. 安装依赖
npm install
# 3. 项目构建
npm run build
# 4. PM2启动生产环境
pm2 start ecosystem.config.js --env production
# 5. 保存进程列表
pm2 save
后续迭代更新
bash
git pull
npm install
npm run build
pm2 reload ecosystem.config.js --env production
普通服务重载:
bash
pm2 reload my-node-app
十六、NestJS 项目使用 PM2 示例
NestJS 构建后入口:dist/main.js
配置文件:
javascript
// ecosystem.config.js
module.exports = {
apps: [
{
name: 'nestjs-api',
script: './dist/main.js',
instances: 2,
exec_mode: 'cluster',
autorestart: true,
watch: false,
max_memory_restart: '500M',
env_production: {
NODE_ENV: 'production',
PORT: 3000
}
}
]
};
部署&更新命令:
bash
npm install
npm run build
pm2 start ecosystem.config.js --env production
pm2 save
# 更新
git pull
npm install
npm run build
pm2 reload nestjs-api
十七、Next.js 项目使用 PM2 示例
命令行启动方式:
bash
npm run build
pm2 start npm --name next-app -- start
配置文件方式:
javascript
module.exports = {
apps: [
{
name: 'next-app',
script: 'npm',
args: 'start',
instances: 1,
autorestart: true,
watch: false,
env_production: {
NODE_ENV: 'production',
PORT: 3000
}
}
]
};
启动命令:
bash
pm2 start ecosystem.config.js --env production
十八、常见问题
1. PM2 启动后访问不到服务
bash
# 查看报错日志
pm2 logs
# 查看进程状态
pm2 list
# 检查端口监听
netstat -tunlp | grep 3000
# 或
lsof -i :3000
2. 修改代码不生效
未开启 watch 需手动重载/重启:
bash
pm2 restart my-node-app
# 或平滑重载
pm2 reload my-node-app
生产环境不建议开启 watch,避免日志、临时文件触发频繁重启。
3. 服务器重启后应用丢失
缺少保存进程操作,标准流程:
bash
pm2 startup
pm2 save
4. 查看 PM2 所有进程
bash
pm2 list
pm2 status
5. 彻底删除 PM2 应用
bash
# 删除单个
pm2 delete my-node-app
pm2 save
# 删除所有
pm2 delete all
pm2 save
十九、生产环境使用建议
- 统一使用
ecosystem.config.js管理应用 - 生产环境关闭 watch 文件监听
- 配置
max_memory_restart限制内存溢出 - 上线后执行
pm2 save保存进程 - 必配
pm2 startup开机自启 - 集群模式更新优先使用
pm2 reload - 定期查看日志排查异常
- 配合 Nginx 做反向代理
- 核心服务接入外部监控告警
- 敏感配置通过环境变量注入,不硬编码
二十、总结
PM2 是 Node.js 项目部署必备生产级进程管理工具 ,相比原生 node app.js 启动,具备以下核心价值:
- 应用崩溃自动守护重启
- 服务后台常驻运行
- 统一日志收集与查看
- 多项目集中管理
- CPU、内存实时监控
- 多核集群负载均衡
- 服务器开机自启
- 集群模式零停机平滑重载
无论是 Express、Koa、NestJS 后端,还是 Next.js、Nuxt 服务端渲染项目、WebSocket 长连接服务,PM2 都是服务器长期部署的最优选择之一。