【运维】PM2 使用完全指南:Node.js 应用进程管理利器

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/ 目录下,每个应用都有对应的 outerror 日志文件。

监控和性能

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

最佳实践

  1. 始终使用配置文件:生产环境务必使用配置文件管理应用
  2. 合理设置实例数量:集群模式下,实例数通常设置为 CPU 核心数
  3. 配置内存限制:防止内存泄漏导致系统崩溃
  4. 启用日志轮转:避免日志文件过大
  5. 使用环境变量:通过不同环境配置管理开发/生产环境
  6. 定期监控:使用 PM2 的监控功能及时发现性能问题
  7. 备份进程列表 :使用 pm2 save 定期备份当前运行的应用

总结

PM2 是 Node.js 应用部署和管理的瑞士军刀。它不仅解决了基本的进程守护问题,还提供了负载均衡、日志管理、性能监控等高级功能。通过合理配置和使用 PM2,您可以大大简化 Node.js 应用的运维工作,提高应用的稳定性和可维护性。

无论您是在开发环境还是生产环境,PM2 都能为您提供强大的支持。掌握 PM2 的使用,是每个 Node.js 开发者的必备技能。

相关推荐
木下~learning2 小时前
Linux 驱动:RK3399 从零手写 GT911 电容触摸屏驱动(完整可运行)
linux·运维·服务器
wanhengidc3 小时前
流量清洗的作用是什么?
运维·服务器·网络·安全·web安全·智能手机
全栈工程师修炼指南3 小时前
Nginx | 磁盘IO层面性能优化秘诀:error 日志内存环形缓冲区及小文件 sendfile 零拷贝技术
运维·网络·nginx·性能优化
@LuckY BoY3 小时前
Linux Mint 上开启 VNC 远程桌面
linux·运维·服务器
ywgcsxue3 小时前
在麒麟V10上源码编译安装Nginx
linux·运维·服务器·nginx
Warren984 小时前
Windows本地部署n8n完整教程(基于Docker,新手友好)
运维·windows·python·测试工具·docker·容器·可用性测试
somi74 小时前
ARM-05-Platform + DTS + GPIO子系统 + 中断 + 等待队列 + 错误处理
linux·运维·arm开发
小粉粉hhh4 小时前
Node.js(一)——初始Node.js
node.js
T0uken4 小时前
【Linux】耗时任务执行并邮件通知
linux·运维·服务器