PM2 使用完全指南:Node.js 应用进程管理利器
在现代 Node.js 开发中,应用的部署、监控和管理是每个开发者都必须面对的挑战。PM2(Process Manager 2)作为一款强大的 Node.js 进程管理工具,能够帮助我们轻松解决这些问题。本文将详细介绍 PM2 的核心功能和最佳实践。
什么是 PM2?
PM2 是一个高级的 Node.js 进程管理器,具有内置的负载均衡器。它可以让您保持应用程序永远在线,即使出现故障也能自动重启,并且提供了丰富的监控和日志管理功能。
PM2 的主要特性包括:
- 进程守护:确保应用始终运行
- 负载均衡:支持集群模式,充分利用多核 CPU
- 零停机重载:更新应用时无需中断服务
- 日志管理:自动分割和轮转日志文件
- 监控面板:实时查看应用性能指标
- 启动脚本:自动生成系统启动脚本
- 配置文件:通过 JSON/YAML 文件管理复杂应用
安装 PM2
PM2 提供了多种包管理器安装方式,您可以根据自己的环境和偏好选择合适的方法。
1. npm 全局安装(推荐)
这是最常用的方式,适用于所有支持 Node.js 的平台:
bash
npm install -g pm2
2. Yarn 安装
如果您使用 Yarn 作为包管理器,可以使用以下命令:
bash
yarn global add pm2
3. pnpm 安装
如果您使用 pnpm 作为包管理器,可以使用以下命令:
bash
pnpm add -g pm2
安装完成后,您可以通过以下命令验证安装:
bash
pm2 --version
基本使用
启动应用
最简单的启动方式是直接指定应用文件:
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核心数相同的实例
查看应用状态
PM2 提供了多种方式查看应用状态:
bash
# 列出所有运行的应用
pm2 list
pm2 ls
pm2 status
# 查看详细信息
pm2 describe app-name
pm2 info app-name
# JSON 格式输出
pm2 jlist
管理应用生命周期
bash
# 停止应用
pm2 stop app-name
pm2 stop all # 停止所有应用
# 重启应用
pm2 restart app-name
pm2 restart all
# 重载应用(零停机)
pm2 reload app-name
pm2 reload all
# 删除应用(停止并从列表中移除)
pm2 delete app-name
pm2 del all
配置文件管理
对于复杂的生产环境,建议使用配置文件来管理应用。PM2 支持 JavaScript、JSON 和 YAML 格式的配置文件。
生成配置文件模板
bash
pm2 ecosystem
# 或
pm2 init
这会生成一个 ecosystem.config.js 文件:
javascript
module.exports = {
apps: [{
name: 'my-app',
script: './app.js',
instances: 'max', // 使用最大CPU核心数
exec_mode: 'cluster', // 集群模式
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 8080
},
log_file: './logs/app.log',
error_file: './logs/app-error.log',
out_file: './logs/app-out.log',
merge_logs: true,
watch: false, // 是否监听文件变化
max_memory_restart: '1G', // 内存超过1G时重启
autorestart: true, // 自动重启
cron_restart: '0 0 * * *', // 每天午夜重启
kill_timeout: 1600, // 关闭超时时间(毫秒)
restart_delay: 3000, // 重启延迟(毫秒)
max_restarts: 10 // 最大重启次数
}]
};
使用配置文件启动应用
bash
# 启动配置文件中的所有应用
pm2 start ecosystem.config.js
# 启动特定环境
pm2 start ecosystem.config.js --env production
日志管理
PM2 自动为每个应用创建日志文件,并提供便捷的日志查看命令:
bash
# 查看实时日志
pm2 logs app-name
# 查看最后N行日志
pm2 logs app-name --lines 100
# 清空所有日志
pm2 flush
# 重新加载日志文件(用于日志轮转)
pm2 reloadLogs
日志文件默认存储在 ~/.pm2/logs/ 目录下,每个应用都有对应的 out 和 error 日志文件。
监控和性能
PM2 提供了强大的监控功能:
bash
# 启动终端监控面板
pm2 monit
# 查看系统信息
pm2 slist
# 启动 Web 仪表板
pm2 dashboard
监控面板会显示 CPU 使用率、内存占用、请求速率等关键指标。
高级功能
零停机部署
PM2 支持零停机重载,这对于生产环境至关重要:
bash
# 重载应用(新请求会路由到新实例)
pm2 reload app-name
# 对于不支持优雅关闭的应用,使用 gracefulReload
pm2 gracefulReload app-name
自动启动
让 PM2 在系统启动时自动启动您的应用:
bash
# 生成启动脚本
pm2 startup
# 保存当前进程列表
pm2 save
# 恢复保存的进程
pm2 resurrect
内存限制重启
当应用内存使用超过阈值时自动重启:
bash
# 命令行方式
pm2 start app.js --max-memory-restart 500M
# 配置文件方式
{
max_memory_restart: '1G'
}
文件监听和自动重启
开发环境中,可以启用文件监听功能:
bash
# 监听文件变化并自动重启
pm2 start app.js --watch
# 忽略特定文件或目录
pm2 start app.js --watch --ignore-watch="node_modules"
实际示例
让我们创建一个完整的示例应用来演示 PM2 的功能:
sample-app.js
javascript
const http = require('http');
const os = require('os');
const server = http.createServer((req, res) => {
const uptime = process.uptime();
const memoryUsage = process.memoryUsage();
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
message: 'Hello from PM2!',
hostname: os.hostname(),
pid: process.pid,
uptime: uptime.toFixed(2) + ' seconds',
memory: {
rss: Math.round(memoryUsage.rss / 1024 / 1024) + ' MB',
heapTotal: Math.round(memoryUsage.heapTotal / 1024 / 1024) + ' MB',
heapUsed: Math.round(memoryUsage.heapUsed / 1024 / 1024) + ' MB'
},
timestamp: new Date().toISOString()
}));
});
const PORT = process.env.PORT || 8080;
server.listen(PORT, () => {
console.log(`Server running on port ${PORT}, PID: ${process.pid}`);
});
启动命令
bash
# 启动2个实例的集群模式
pm2 start sample-app.js --name "my-app" -i 2
# 查看状态
pm2 list
# 查看日志
pm2 logs my-app
最佳实践
- 始终使用配置文件:生产环境务必使用配置文件管理应用
- 合理设置实例数量:集群模式下,实例数通常设置为 CPU 核心数
- 配置内存限制:防止内存泄漏导致系统崩溃
- 启用日志轮转:避免日志文件过大
- 使用环境变量:通过不同环境配置管理开发/生产环境
- 定期监控:使用 PM2 的监控功能及时发现性能问题
- 备份进程列表 :使用
pm2 save定期备份当前运行的应用
总结
PM2 是 Node.js 应用部署和管理的瑞士军刀。它不仅解决了基本的进程守护问题,还提供了负载均衡、日志管理、性能监控等高级功能。通过合理配置和使用 PM2,您可以大大简化 Node.js 应用的运维工作,提高应用的稳定性和可维护性。
无论您是在开发环境还是生产环境,PM2 都能为您提供强大的支持。掌握 PM2 的使用,是每个 Node.js 开发者的必备技能。