PM2 崩溃恢复
在生产环境中,应用可能会由于各种原因崩溃或异常退出。为了确保应用在崩溃后能够自动恢复,PM2 提供了崩溃恢复机制。当进程崩溃时,PM2 会自动重启进程,确保应用始终保持在线。
1. 自动重启
PM2 默认启用了自动重启功能。当 Node.js 应用崩溃时,PM2 会自动尝试重新启动该进程。这样可以避免由于进程崩溃导致的服务中断,确保系统的高可用性。
示例配置
module.exports = {
apps: [
{
name: 'my-app',
script: './app.js',
watch: true, // 启用文件监控
autorestart: true, // 启用自动重启
max_restarts: 10, // 最大重启次数
restart_delay: 5000, // 崩溃后 5 秒重启
},
],
};在此配置中,当 my-app 应用崩溃时,PM2 会自动重启该应用。max_restarts 设置了最大重启次数,超过该次数后应用不会继续重启。restart_delay 设置了崩溃后的重启延迟,避免频繁重启带来的系统压力。
2. 监控崩溃并重启
PM2 提供了 watch 功能,可以在文件发生变动时自动重启应用。这个功能特别适用于开发环境,但同样适用于生产环境中的崩溃恢复。如果文件系统中的某些关键文件被修改,PM2 会检测到这些变化并自动重启应用。
启用文件监控
module.exports = {
apps: [
{
name: 'my-app',
script: './app.js',
watch: true, // 启用文件监控
autorestart: true, // 启用自动重启
},
],
};适用场景
- 适用于开发阶段,监控代码和配置文件变化。
- 适用于生产环境中的故障恢复,尤其是依赖外部文件和配置的应用。
3. 进程健康检查
在某些情况下,崩溃可能是因为应用内存泄漏、无限循环或其他异常情况。为了进一步提升崩溃恢复机制,可以使用 健康检查,定期检查应用是否正常运行。通过外部服务(如 Pingdom 或自定义脚本)来监控应用的健康状态,如果发现应用异常,可以触发重启操作。
示例:通过外部健康检查触发重启
- 创建一个健康检查脚本,检测应用是否在正常运行:
#!/bin/bash
if ! curl -s http://localhost:3000/health | grep "OK"; then
pm2 restart my-app
fi- 使用
cron定时任务每分钟运行此脚本:
* * * * * /path/to/health-check.sh通过这种方式,应用如果出现异常或无法响应时,会自动触发重启。
4. 平滑重启
当应用崩溃并重新启动时,平滑重启可以保证应用的连续性。在生产环境中,使用 pm2 reload 进行平滑重启,可以确保在不中断服务的情况下重启应用。
使用平滑重启
pm2 reload my-apppm2 reload 命令会在不中断用户请求的情况下重启应用,适用于高可用的生产环境。
5. 自定义崩溃恢复策略
你可以根据实际需求,编写自定义的崩溃恢复策略。例如,监控进程的 CPU 使用率、内存消耗等,当这些资源消耗过高时,可以主动进行重启操作。
示例:基于 CPU 使用率触发重启
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, // 禁用 PM2 自动重启
}, function (err, apps) {
if (err) throw err;
// 自定义逻辑:监控 CPU 使用率
setInterval(() => {
const cpuUsage = getCPUUsage(); // 假设获取 CPU 使用率的函数
if (cpuUsage > 80) {
pm2.restart('my-app', (err) => {
if (err) console.error('Restart failed');
});
}
}, 10000); // 每 10 秒检查一次 CPU 使用率
});
});6. 总结
PM2 的崩溃恢复机制是确保 Node.js 应用高可用性的关键功能。通过合理配置自动重启、文件监控、健康检查和资源监控,可以确保应用在崩溃后迅速恢复,并保持持续稳定运行。结合平滑重启和自定义恢复策略,PM2 可以满足不同场景下的高可用性需求,帮助开发者高效地管理应用生命周期。