PM2 使用指南 🚀
简介
PM2 不仅是一个 Node.js 应用进程管理器,它还可以管理任何类型的应用程序,包括 Java、Python、Ruby、Bash 脚本等。本指南将介绍如何使用 PM2 管理 Node.js 和 Java 应用。
- 进程管理 🎛️
- 负载均衡 ⚖️
- 日志管理 📄
- 开机自启 🔌
- 多应用支持 📦
安装
bash
npm install pm2 -gbash
yarn global add pm2bash
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 initbash
# 直接启动 Node.js 应用
pm2 start app.jsbash
# 使用集群模式启动
pm2 start app.js -i maxbash
# 使用配置文件启动
pm2 start ecosystem.config.jsNode.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.jarbash
# 启动带参数的 Java 应用
pm2 start java -- -Xmx2G -jar app.jarbash
# 启动带配置文件的 Java 应用
pm2 start ecosystem.config.mjs --only java-appJava 配置示例
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 管理配置
通用注意事项
生产环境配置
- 关闭
watch选项 - 设置合理的内存限制
- 配置日志轮转
- 启用开机自启
- 关闭
资源管理
- 监控内存使用
- 定期检查日志大小
- 合理设置重启策略
- 避免过度重启
常见问题
内存溢出
- 检查应用内存使用情况:
bash
pm2 monit- 调整内存限制:
javascript
{
max_memory_restart: "2G",
// 对于 Java 应用还需设置 JVM 参数
args: ["-Xmx2G", "-Xms1G"]
}日志管理
- 配置日志文件:
javascript
{
error_file: "logs/error.log",
out_file: "logs/out.log",
log_date_format: "YYYY-MM-DD HH:mm:ss Z",
merge_logs: true
}- 查看日志:
bash
pm2 logs [app_name]开机自启
- 生成开机自启脚本:
bash
pm2 startup- 保存当前进程列表:
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
}
}