PM2 从入门到精通
目录
常用配置 【放这里方便大家直接cv,部署项目】
以下是一个简单的单例应用ecosystem.config.js
配置示例,适合日常使用:
// ecosystem.config.js
module.exports = {
apps: [{
name: "my-app", // 应用名称
script: "./app.js", // 入口脚本
watch: false, // 是否监视文件变化
max_memory_restart: "300M", // 内存限制
env: { // 默认环境变量
NODE_ENV: "development",
PORT: 3000
},
env_production: { // 生产环境变量
NODE_ENV: "production",
PORT: 8080
},
log_date_format: "YYYY-MM-DD HH:mm:ss", // 日志日期格式
error_file: "./logs/error.log", // 错误日志
out_file: "./logs/out.log", // 标准输出日志
merge_logs: true, // 合并日志
autorestart: true // 自动重启
}]
};
使用方法:
# 开发环境启动
pm2 start ecosystem.config.js
# 生产环境启动
pm2 start ecosystem.config.js --env production
# 重启应用
pm2 restart ecosystem.config.js
这个简单配置包含了单个应用的基本设置,适合大多数项目使用。你可以根据需要添加或删除配置项。
简介
PM2(Process Manager 2)是一个为Node.js应用程序设计的生产环境进程管理器。它允许你保持应用程序永远在线,无需停机即可重新加载,并简化常见的系统管理任务。
PM2的主要特点:
- 应用程序监控
- 自动重启
- 日志管理
- 集群模式
- 零停机重载
- 启动脚本
- 多平台支持
- 内置负载均衡
- 容器集成
安装
全局安装
npm install pm2 -g
使用yarn
yarn global add pm2
验证安装
pm2 --version
基础使用
启动应用
# 基本启动
pm2 start app.js
# 指定应用名称
pm2 start app.js --name "my-app"
# 启动并监视文件变化(开发环境)
pm2 start app.js --watch
# 设置环境变量
pm2 start app.js --env production
管理应用进程
# 列出所有应用
pm2 list
# 显示应用详细信息
pm2 show <app_name|id>
# 重启应用
pm2 restart <app_name|id>
# 停止应用
pm2 stop <app_name|id>
# 删除应用
pm2 delete <app_name|id>
# 重启所有应用
pm2 restart all
# 停止所有应用
pm2 stop all
# 删除所有应用
pm2 delete all
进程管理
管理多个应用
# 同时启动多个应用
pm2 start app1.js app2.js app3.js
# 使用不同配置启动多个应用
pm2 start app1.js --name "app1" -- watch
pm2 start app2.js --name "app2" --env production
自动重启策略
PM2可以配置不同的重启策略:
# 出错时重启
pm2 start app.js --max-restarts 10
# 设置内存限制(当超过此限制时自动重启)
pm2 start app.js --max-memory-restart 500M
配置文件
PM2可以使用配置文件(通常命名为ecosystem.config.js
)来管理多个应用及其配置。
创建配置文件
pm2 init
这将创建一个基本的ecosystem.config.js
文件,你可以编辑它:
module.exports = {
apps : [{
name: "app",
script: "./app.js",
instances: "max",
exec_mode: "cluster",
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
}
}]
}
使用配置文件
# 启动配置文件中定义的所有应用
pm2 start ecosystem.config.js
# 启动特定应用
pm2 start ecosystem.config.js --only app1
# 使用特定环境
pm2 start ecosystem.config.js --env production
配置选项
常用配置选项:
选项 | 描述 |
---|---|
name | 应用名称 |
script | 启动脚本路径 |
cwd | 应用目录 |
args | 传递给脚本的参数 |
instances | 实例数量(集群模式) |
exec_mode | 执行模式 (‘fork’ 或 ‘cluster’) |
watch | 是否监视文件变化 |
ignore_watch | 指定不监视的文件或目录 |
max_memory_restart | 内存限制 |
env_* | 特定环境配置 |
log_date_format | 日志日期格式 |
error_file | 错误日志文件路径 |
out_file | 输出日志文件路径 |
pid_file | PID文件路径 |
cron_restart | cron表达式重启策略 |
autorestart | 进程崩溃后是否自动重启 |
日志管理
查看日志
# 显示所有应用的日志
pm2 logs
# 显示特定应用的日志
pm2 logs <app_name|id>
# 显示行数限制
pm2 logs --lines 200
# 显示JSON格式日志
pm2 logs --json
日志配置
在配置文件中可以定义日志相关设置:
module.exports = {
apps : [{
name: "app",
script: "./app.js",
log_date_format: "YYYY-MM-DD HH:mm:ss",
error_file: "./logs/error.log",
out_file: "./logs/out.log",
log_file: "./logs/combined.log",
combine_logs: true,
// 日志轮转设置
log_type: "json",
merge_logs: true,
}]
}
日志轮转
PM2内置了日志轮转功能,使用pm2-logrotate模块:
pm2 install pm2-logrotate
# 配置日志轮转
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
监控
实时监控
# 启动内置监控
pm2 monit
这将打开一个基于终端的监控界面,显示CPU使用率、内存使用、响应时间等信息。
PM2 Plus (云端监控)
PM2提供了一个名为PM2 Plus的云监控服务:
# 注册并链接
pm2 register
pm2 link <secret> <public>
PM2 Plus提供:
- 长期指标历史
- 异常追踪
- 实时日志访问
- 自动化部署
- 团队协作
- 警报和通知
集群模式
PM2的一个强大功能是能够在多个CPU核心上运行Node.js应用的多个实例。
启用集群模式
# 使用最大CPU核心数
pm2 start app.js -i max
# 使用指定数量的核心
pm2 start app.js -i 4
# 在配置文件中
module.exports = {
apps : [{
name: "app",
script: "./app.js",
instances: "max",
exec_mode: "cluster"
}]
}
使用场景
集群模式适合:
- 无状态应用
- CPU密集型应用
- 高流量服务
- 需要高可用性的应用
负载均衡
PM2的集群模式自动包含负载均衡功能,使用Node.js的cluster
模块来跨进程分配请求。
部署
PM2提供了简化部署流程的功能。
设置部署配置
在ecosystem.config.js
中添加部署配置:
module.exports = {
apps: [{
name: "app",
script: "app.js"
}],
deploy: {
production: {
user: "username",
host: ["host1", "host2"],
ref: "origin/master",
repo: "git@github.com:repo.git",
path: "/var/www/production",
"pre-deploy": "git fetch --all",
"post-deploy": "npm install && pm2 reload ecosystem.config.js --env production"
},
staging: {
// 类似的配置...
}
}
}
执行部署
# 首次设置
pm2 deploy production setup
# 部署
pm2 deploy production
# 部署并执行特定命令
pm2 deploy production exec "npm run build"
# 回滚
pm2 deploy production revert 2
高级功能
开机自启
PM2可以生成启动脚本以确保服务器重启后应用自动启动:
# 生成并配置启动脚本
pm2 startup
# 保存当前运行的应用列表
pm2 save
优雅重启
PM2支持优雅重启,允许您在不丢失连接的情况下更新应用程序:
pm2 gracefulReload all
触发事件
PM2允许在应用生命周期的不同点触发自定义操作:
// 在应用中
process.on('SIGINT', function() {
// 清理操作
db.close();
process.exit(0);
});
使用钩子
在配置文件中定义钩子来自动化操作:
module.exports = {
apps: [{
name: "app",
script: "./app.js",
// 生命周期钩子
"pre-setup": "npm install",
"post-start": "echo 'App has started'",
"pre-stop": "echo 'App is stopping'",
"post-restart": "echo 'App has restarted'"
}]
}
使用模块扩展PM2
PM2支持模块来扩展其功能:
# 安装模块
pm2 install pm2-logrotate
# 查看已安装模块
pm2 module list
# 卸载模块
pm2 uninstall pm2-logrotate
最佳实践
生产环境配置
- 总是使用配置文件:使用
ecosystem.config.js
管理所有设置 - 设置内存限制:通过
max_memory_restart
防止内存泄漏 - 启用集群模式:充分利用多核CPU
- 配置日志:设置日志轮转和适当的格式
- 配置启动脚本:使用
pm2 startup
和pm2 save
确保可靠性 - 设置环境变量:使用
--env
区分不同环境 - 监控应用:使用
pm2 monit
或PM2 Plus观察性能
安全考虑
- 限制资源使用:设置内存和CPU限制
- 特权降级:使用非root用户运行PM2
- 安全处理敏感信息:使用环境变量或密钥管理系统
- 保护PM2 API:如果使用PM2 API,确保适当的访问控制
容器化环境
在Docker等容器环境中使用PM2:
-
使用
pm2-runtime
(专为容器设计):pm2-runtime start ecosystem.config.js
-
Dockerfile示例:
FROM node:14 WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm install pm2 -g CMD ["pm2-runtime", "ecosystem.config.js"]
常见问题与解决方案
问题1: 应用崩溃但PM2没有重启
解决方案:
- 检查
autorestart
设置是否为true
- 增加
max_restarts
值 - 检查应用是否以
0
状态码退出(PM2认为这是正常退出)
问题2: 内存使用持续增加
解决方案:
- 设置
max_memory_restart
限制 - 使用内存泄漏检测工具调查
- 考虑实现定期重启策略
问题3: 日志文件过大
解决方案:
- 配置pm2-logrotate模块
- 设置合理的日志轮转策略
- 考虑使用外部日志系统,如ELK或Papertrail
问题4: 集群模式下应用状态不一致
解决方案:
- 使用Redis等外部存储共享状态
- 确保应用设计为无状态
- 使用适当的消息传递机制
问题5: 启动后应用不接受连接
解决方案:
- 使用
--wait-ready
标志和进程信号 - 在应用准备好后发送
process.send('ready')
- 增加
listen_timeout
值
参考资源
本文档提供了PM2的主要功能和使用场景的全面概述。随着您的深入使用,建议参考官方文档以获取最新的特性和详细信息。