Skip to content

PM2 使用指南 🚀

简介

PM2 不仅是一个 Node.js 应用进程管理器,它还可以管理任何类型的应用程序,包括 Java、Python、Ruby、Bash 脚本等。本指南将介绍如何使用 PM2 管理 Node.js 和 Java 应用。

  • 进程管理 🎛️
  • 负载均衡 ⚖️
  • 日志管理 📄
  • 开机自启 🔌
  • 多应用支持 📦

安装

bash
npm install pm2 -g
bash
yarn global add pm2
bash
pnpm add -g pm2

基本命令

命令速查

命令说明示例
start启动应用pm2 start app.js
stop停止应用pm2 stop app_name
restart重启应用pm2 restart app_name
delete删除应用pm2 delete app_name
list列出应用pm2 list
monit监控应用pm2 monit
logs查看日志pm2 logs [app_name]
save保存进程列表pm2 save
startup设置开机自启pm2 startup

启动应用

查看启动命令详情
bash
# 启动应用
pm2 start app.js

# 启动应用并命名
pm2 start app.js --name "my-app"

# 启动应用并指定实例数量(集群模式)
pm2 start app.js -i 4  # 4个实例
pm2 start app.js -i max  # 根据CPU核心数启动最大实例数

应用管理

Node.js 应用

创建配置文件

bash
pm2 init
bash
# 直接启动 Node.js 应用
pm2 start app.js
bash
# 使用集群模式启动
pm2 start app.js -i max
bash
# 使用配置文件启动
pm2 start ecosystem.config.js
Node.js 配置示例
javascript
export default {
  apps: [{
    name: "node-app",
    script: "./app.js",
    exec_mode: "cluster",
    instances: 4,
    // ... 其他配置
  }]
}

Java 应用

bash
# 启动 Spring Boot JAR
pm2 start java -- -jar app.jar
bash
# 启动带参数的 Java 应用
pm2 start java -- -Xmx2G -jar app.jar
bash
# 启动带配置文件的 Java 应用
pm2 start ecosystem.config.mjs --only java-app
Java 配置示例
javascript
export default {
  apps: [{
    name: "java-app",
    script: "java",
    args: [
      "-Xmx2G",                           // 最大堆内存
      "-Xms1G",                           // 初始堆内存
      "-XX:+HeapDumpOnOutOfMemoryError", // OOM时导出堆转储
      "-jar",
      "./target/myapp.jar",              // JAR 包路径
      "--spring.profiles.active=prod",    // Spring Boot 配置文件
      "--server.port=8080"               // 服务器端口
    ],
    env: {
      JAVA_HOME: "/path/to/java",        // Java 路径
    },
    exec_mode: "fork",                   // Java 应用使用 fork 模式
    instances: 1,                        // Java 应用通常使用单实例
    max_memory_restart: "2G",            // 内存限制
    error_file: "logs/java-error.log",   // 错误日志
    out_file: "logs/java-out.log",       // 标准输出日志
    merge_logs: true,
    log_date_format: "YYYY-MM-DD HH:mm:ss Z"
  }]
}

多应用管理

多应用配置

PM2 支持在同一个配置文件中管理多个不同类型的应用。以下是一个完整的多应用配置示例:

javascript
export default {
  apps: [
    {
      // Node.js API 服务
      name: "node-api",
      script: "./api/app.js",
      exec_mode: "cluster",
      instances: 4,
      env: {
        NODE_ENV: "production",
        PORT: 3000
      }
    },
    {
      // Java Spring Boot 服务
      name: "java-service",
      script: "java",
      args: [
        "-jar",
        "./target/service.jar",
        "--spring.profiles.active=prod"
      ],
      exec_mode: "fork",
      env: {
        JAVA_HOME: "/path/to/java"
      }
    },
    {
      // 前端静态服务
      name: "static-server",
      script: "serve",
      args: ["-s", "build", "-l", "5000"],
      exec_mode: "fork"
    }
  ]
}
javascript
export default {
  apps: [
    {
      // Node.js API 服务
      name: "node-api",    // 应用名称
      script: "./api/app.js",  // 应用入口文件
      exec_mode: "cluster",   // 应用程序启动模式
      instances: 4,    // 应用实例数量
      // watch: true,   // 开启监听模式,当文件发生变化时自动重启

      // 不监听的文件
      ignore_watch: [
        "node_modules",
        "logs",
        "public",
        ".git"
      ],

      // 开发环境配置
      env: {
        NODE_ENV: "production",   // 生产环境, 或 development 开发环境
        PORT: 3000   // 
      },
      // 日志配置
      log_date_format: "YYYY-MM-DD HH:mm:ss Z",  // 日志时间格式
      error_file: "logs/error.log", // 错误日志文件
      out_file: "logs/out.log",     // 输出日志文件
      merge_logs: true,             // 集群模式下合并日志
      log_type: "raw",             // 日志格式(json/raw),raw 为原始日志格式
    }
  ]
}
bash
# 启动所有应用
pm2 start ecosystem.config.js

# 启动特定应用
pm2 start ecosystem.config.js --only node-api

# 使用生产环境配置启动
pm2 start ecosystem.config.js --env production

最佳实践

配置建议

Node.js 应用

  • 使用 cluster 模式提高性能
  • 实例数量设置为 CPU 核心数
  • 开发环境开启 watch 模式
  • 生产环境关闭 watch 模式

Java 应用

  • 使用 fork 模式运行
  • 合理设置 JVM 内存参数
  • 配置 OOM 时的堆转储
  • 使用 Spring profiles 管理配置

通用注意事项

  1. 生产环境配置

    • 关闭 watch 选项
    • 设置合理的内存限制
    • 配置日志轮转
    • 启用开机自启
  2. 资源管理

    • 监控内存使用
    • 定期检查日志大小
    • 合理设置重启策略
    • 避免过度重启

常见问题

内存溢出
  1. 检查应用内存使用情况:
bash
pm2 monit
  1. 调整内存限制:
javascript
{
  max_memory_restart: "2G",
  // 对于 Java 应用还需设置 JVM 参数
  args: ["-Xmx2G", "-Xms1G"]
}
日志管理
  1. 配置日志文件:
javascript
{
  error_file: "logs/error.log",
  out_file: "logs/out.log",
  log_date_format: "YYYY-MM-DD HH:mm:ss Z",
  merge_logs: true
}
  1. 查看日志:
bash
pm2 logs [app_name]
开机自启
  1. 生成开机自启脚本:
bash
pm2 startup
  1. 保存当前进程列表:
bash
pm2 save

进阶功能

可用功能

  • [x] 负载均衡
  • [x] 零停机重启
  • [x] 性能监控
  • [x] 日志管理
  • [x] 集群模式
  • [x] 开机自启
  • [x] 环境管理
性能监控

使用 pm2 monit 查看实时性能数据:

  • CPU 使用率
  • 内存使用
  • 请求响应时间
  • 错误日志
  • 集群状态
环境管理
javascript
{
  // 开发环境
  env: {
    NODE_ENV: "development",
    PORT: 3000
  },
  // 生产环境
  env_production: {
    NODE_ENV: "production",
    PORT: 8080
  }
}

相关资源