# PM2 重启策略

URL: https://caijiao.org/pm2/auto-restart/restart-strategy
Source: docs/pm2/auto-restart/restart-strategy.md
Description: 了解 PM2 的重启策略，掌握如何根据不同的需求配置自动重启规则，如内存限制、时间限制、重启次数等，确保 Node.js 应用在异常时能自动恢复，保持高可用性。

在生产环境中，应用可能会因为内存泄漏、异常错误或其他原因崩溃。为了确保应用的高可用性，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 都提供了灵活的方式来帮助你管理应用的生命周期，确保系统在高负载和高压力情况下仍然能够稳定运行。
