PM2 介绍与使用教程:Node.js 项目的进程管理利器

一、什么是 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 非常适合以下场景:

  1. Node.js 后端服务部署
  2. Express、Koa、NestJS 项目部署
  3. Nuxt、Next.js 服务端渲染项目部署
  4. WebSocket 服务部署
  5. 定时任务服务部署
  6. 内网工具、管理后台、接口服务长期运行
  7. 多个 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

十九、生产环境使用建议

  1. 统一使用 ecosystem.config.js 管理应用
  2. 生产环境关闭 watch 文件监听
  3. 配置 max_memory_restart 限制内存溢出
  4. 上线后执行 pm2 save 保存进程
  5. 必配 pm2 startup 开机自启
  6. 集群模式更新优先使用 pm2 reload
  7. 定期查看日志排查异常
  8. 配合 Nginx 做反向代理
  9. 核心服务接入外部监控告警
  10. 敏感配置通过环境变量注入,不硬编码

二十、总结

PM2 是 Node.js 项目部署必备生产级进程管理工具 ,相比原生 node app.js 启动,具备以下核心价值:

  • 应用崩溃自动守护重启
  • 服务后台常驻运行
  • 统一日志收集与查看
  • 多项目集中管理
  • CPU、内存实时监控
  • 多核集群负载均衡
  • 服务器开机自启
  • 集群模式零停机平滑重载

无论是 Express、Koa、NestJS 后端,还是 Next.js、Nuxt 服务端渲染项目、WebSocket 长连接服务,PM2 都是服务器长期部署的最优选择之一。

相关推荐
ganshenml2 小时前
【鸿蒙】 DevEco Studio + Node.js 多版本环境配置实战(n 管理器踩坑总结)
华为·node.js·harmonyos
马踏岛国赏樱花2 小时前
vim新手入门配置
编辑器·vim·excel
Beginner x_u13 小时前
前端八股整理(工程化 02)|CommonJS/ESM、Webpack Loader/Plugin 与Vite 对比
前端·webpack·node.js·plugin·loader
苦夏木禾14 小时前
URL 类 详解
node.js·js
古怪今人21 小时前
Windows系统+VSCode 开发Python和Java项目 AI代码编辑器Trae插件安装
ide·vscode·编辑器
普通young man21 小时前
vim常用编辑和视图(个人笔记)
笔记·编辑器·vim
mascon1 天前
Unity 编辑器扩展
unity·编辑器·游戏引擎
是谁眉眼1 天前
npm执行错误 但黑窗口node可以成功启动问题分析
前端·npm·node.js
donecoding1 天前
Monorepo 里有 app 也有共享包,lerna 真的还需要吗?
前端·node.js·前端工程化