教程 pm2 tutorial

PM2 重启策略

在生产环境中,应用可能会因为内存泄漏、异常错误或其他原因崩溃。为了确保应用的高可用性,PM2 提供了强大的重启策略。通过合理配置重启规则,PM2 可以自动恢复应用,减少人工干预,提高系统的稳定性。

1. 内存限制重启

PM2 允许你为应用设置内存限制,当进程的内存使用量超过设定的阈值时,PM2 会自动重启该进程。这有助于防止内存泄漏问题导致应用崩溃或系统变慢。

示例配置

javascript
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      max_memory_restart: '200M', // 当应用内存超过 200MB 时重启
    },
  ],
};

`

在此配置中,当 my-app 应用的内存使用量超过 200MB 时,PM2 会自动重启该进程。

其他可配置参数

  • max_memory_restart:设置内存阈值,支持带单位(如 200M、1G 等)。

2. 时间限制重启

除了内存限制外,PM2 还允许你根据进程的运行时间设置重启规则。如果进程运行时间过长,PM2 可以自动重启应用,以防止长期运行的进程出现性能问题。

示例配置

javascript
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      min_uptime: '60s',  // 最小运行时间,防止频繁重启
      max_restarts: 5,    // 最大重启次数,防止死循环重启
    },
  ],
};
  • min_uptime:设置进程最小运行时间。如果应用重启频繁,PM2 会根据这个设置避免频繁的重启。
  • max_restarts:设置最大重启次数,超过次数后应用不再重启。

3. 崩溃恢复重启

PM2 提供了进程守护功能,当进程崩溃或异常退出时,PM2 会自动重启进程,确保应用持续可用。

示例配置

javascript
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      watch: true,       // 监控文件变动,自动重启
      restart_delay: 5000, // 进程崩溃后的重启延迟时间(单位:毫秒)
    },
  ],
};
  • watch:启用文件监控,一旦文件发生变化,PM2 会自动重启应用。
  • restart_delay:设置进程崩溃后的重启延迟时间。这样可以避免在应用崩溃后立即重启,给系统留出一些恢复时间。

4. 平滑重启

PM2 提供了平滑重启功能,使得在应用重启时不会中断服务。通过平滑重启,PM2 会在不中断用户请求的情况下重启应用,保证高可用性。

使用平滑重启

bash
pm2 reload my-app

使用 pm2 reload 命令可以平滑重启应用。该命令会在不中断请求的情况下逐步重启应用的每个进程。

5. 自定义重启策略

PM2 还支持自定义的重启策略。例如,你可以通过事件监听来根据特定条件触发重启。你可以为应用设置自定义重启逻辑,基于事件(如数据库连接失败、API 请求错误等)触发重启。

自定义重启事件

javascript
const pm2 = require('pm2');

pm2.connect(function (err) {
  if (err) {
    console.error(err);
    process.exit(2);
  }

  pm2.start({
    name: 'my-app',
    script: './app.js',
    autorestart: false,  // 禁用自动重启
  }, function (err, apps) {
    if (err) throw err;

    // 在应用特定条件下手动重启
    setInterval(() => {
      // 假设检测到某个错误,需要重启应用
      pm2.restart('my-app', (err) => {
        if (err) console.error('Restart failed');
      });
    }, 10000); // 每 10 秒检查一次
  });
});

在这个示例中,我们禁用了 PM2 的自动重启机制,并通过手动的 pm2.restart 命令基于自定义条件来触发应用的重启。

6. 结语

PM2 的重启策略为应用提供了多种自动恢复机制,确保应用能够在发生故障时自动恢复。通过合理配置内存、时间、崩溃恢复和自定义重启策略,你可以提升 Node.js 应用的稳定性和可用性。

无论是简单的内存限制重启,还是复杂的事件触发重启,PM2 都提供了灵活的方式来帮助你管理应用的生命周期,确保系统在高负载和高压力情况下仍然能够稳定运行。