# PM2 崩溃处理

URL: https://caijiao.org/pm2/troubleshooting/crash-handling
Source: docs/pm2/troubleshooting/crash-handling.md
Description: 了解如何通过 PM2 处理应用崩溃问题，确保 Node.js 应用在遇到崩溃或异常时能够快速恢复，保持系统高可用性和稳定性。

在生产环境中，Node.js 应用崩溃是不可避免的。崩溃可能是由于内存泄漏、未处理的异常或外部依赖错误等原因引起的。PM2 提供了一些内置的功能来帮助开发者管理崩溃并确保应用能够快速恢复。

## 1. **PM2 崩溃恢复机制**

PM2 提供了崩溃恢复机制，可以在应用崩溃后自动重启进程。这意味着，如果 Node.js 应用由于某些错误而崩溃，PM2 会监控到进程停止，并自动重新启动应用以保证服务持续运行。

### 启用崩溃自动重启

PM2 默认启用了自动重启功能，除非通过配置禁用。即使应用崩溃，PM2 也会自动重启应用，确保最小化系统停机时间。

#### 示例：自动重启配置

```javascript
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      watch: true,            // 监控文件变动，自动重启
      autorestart: true,      // 启用崩溃后自动重启
      max_restarts: 10,       // 最大重启次数
      restart_delay: 5000,    // 重启延迟（单位：毫秒）
    },
  ],
};
````

在此配置中：

* `autorestart: true` 确保应用崩溃后会被自动重启。
* `max_restarts: 10` 设置最大重启次数，防止因应用持续崩溃导致无限重启。
* `restart_delay: 5000` 设置每次重启的延迟（例如，5秒钟）。

## 2. **日志记录与监控**

PM2 提供了详细的日志记录功能，可以帮助你分析应用崩溃的原因。在 PM2 中，应用的标准输出和错误输出都会被记录到日志文件中，可以通过 `pm2 logs` 命令查看这些日志。

### 查看应用日志

```bash
pm2 logs my-app
```

此命令会显示 `my-app` 应用的日志，包括崩溃信息、错误堆栈以及其他调试信息。通过这些日志，你可以分析导致崩溃的具体原因。

### 示例：查看最近的 1000 行日志

```bash
pm2 logs my-app --lines 1000
```

这将显示最近的 1000 行日志信息，帮助你定位崩溃发生的时刻及原因。

## 3. **内存限制与自动重启**

内存泄漏是导致 Node.js 应用崩溃的常见原因之一。PM2 提供了 `max_memory_restart` 选项来设置内存限制，当应用使用的内存超过该值时，PM2 会自动重启应用，防止应用因内存过载而崩溃。

### 启用内存限制

```javascript
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      max_memory_restart: '200M',  // 如果内存超过 200MB，则重启
    },
  ],
};
```

在此配置中，`max_memory_restart: '200M'` 会确保当应用的内存使用超过 200MB 时，PM2 会自动重启该应用。这有助于防止内存泄漏或异常导致的崩溃。

## 4. **外部崩溃处理：使用 PM2 集群模式**

在多核环境中，PM2 提供了集群模式来启动多个进程。集群模式可以帮助分担负载并提高应用的可用性。如果某个进程崩溃，PM2 会自动重启该进程，确保其他进程继续正常运行，避免整个应用停机。

### 启用集群模式

```javascript
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      exec_mode: 'cluster',  // 启用集群模式
      instances: 'max',      // 启动与 CPU 核心数相同的进程数
      autorestart: true,     // 启用自动重启
    },
  ],
};
```

在这个配置中，`exec_mode: 'cluster'` 启用了集群模式，而 `instances: 'max'` 会启动与 CPU 核心数相同数量的进程。如果某个进程崩溃，PM2 会自动启动一个新的进程来替代它，保证应用始终在线。

## 5. **使用 PM2 监控崩溃**

PM2 的监控工具可以实时显示应用的状态和资源消耗情况，这对于发现崩溃原因非常有用。你可以使用 `pm2 monit` 命令查看各个进程的 CPU 和内存使用情况。

### 启用监控

```bash
pm2 monit
```

`pm2 monit` 会启动一个交互式控制台，显示所有进程的 CPU、内存使用情况及其他性能指标。通过监控，你可以及时发现内存泄漏、CPU 使用过高等问题，从而提前进行优化，减少崩溃的风险。

## 6. **设置崩溃时的通知**

为了能够快速响应应用崩溃，PM2 还提供了集成第三方通知工具的功能，例如通过邮件、Slack 或其他通知系统提醒你应用崩溃情况。

### 配置 Slack 通知

通过配置 PM2 的通知插件，可以在应用崩溃时向 Slack 发送通知。首先，安装 `pm2-slack` 插件：

```bash
pm2 install pm2-slack
```

然后，使用 `pm2 set` 命令设置 Slack 的 Webhook URL：

```bash
pm2 set pm2-slack:webhook_url https://hooks.slack.com/services/XXXX/YYYY/ZZZZ
```

当应用崩溃时，PM2 会自动向指定的 Slack 频道发送通知，帮助开发者及时了解崩溃问题。

## 7. **总结**

PM2 提供了多种机制来处理应用崩溃问题，确保 Node.js 应用能够在生产环境中保持高可用性和稳定性。通过以下功能，你可以有效防止和处理崩溃：

1. **自动重启**：PM2 会在应用崩溃后自动重启应用。
2. **日志记录**：使用 PM2 的日志功能，帮助你分析应用崩溃的原因。
3. **内存限制**：配置内存限制，防止内存泄漏导致应用崩溃。
4. **集群模式**：在多核环境中，使用集群模式保证应用的高可用性。
5. **监控工具**：通过 PM2 的监控工具实时查看应用的健康状况。
6. **通知集成**：集成 Slack 等通知工具，确保在应用崩溃时及时得到通知。

这些功能结合使用，可以极大地提高应用的稳定性，确保应用在遇到问题时能够自动恢复，保持服务持续运行。
