PM2 重启策略
在生产环境中,应用可能会因为内存泄漏、异常错误或其他原因崩溃。为了确保应用的高可用性,PM2 提供了强大的重启策略。通过合理配置重启规则,PM2 可以自动恢复应用,减少人工干预,提高系统的稳定性。
1. 内存限制重启
PM2 允许你为应用设置内存限制,当进程的内存使用量超过设定的阈值时,PM2 会自动重启该进程。这有助于防止内存泄漏问题导致应用崩溃或系统变慢。
示例配置
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 可以自动重启应用,以防止长期运行的进程出现性能问题。
示例配置
module.exports = {
apps: [
{
name: 'my-app',
script: './app.js',
min_uptime: '60s', // 最小运行时间,防止频繁重启
max_restarts: 5, // 最大重启次数,防止死循环重启
},
],
};- min_uptime:设置进程最小运行时间。如果应用重启频繁,PM2 会根据这个设置避免频繁的重启。
- max_restarts:设置最大重启次数,超过次数后应用不再重启。
3. 崩溃恢复重启
PM2 提供了进程守护功能,当进程崩溃或异常退出时,PM2 会自动重启进程,确保应用持续可用。
示例配置
module.exports = {
apps: [
{
name: 'my-app',
script: './app.js',
watch: true, // 监控文件变动,自动重启
restart_delay: 5000, // 进程崩溃后的重启延迟时间(单位:毫秒)
},
],
};- watch:启用文件监控,一旦文件发生变化,PM2 会自动重启应用。
- restart_delay:设置进程崩溃后的重启延迟时间。这样可以避免在应用崩溃后立即重启,给系统留出一些恢复时间。
4. 平滑重启
PM2 提供了平滑重启功能,使得在应用重启时不会中断服务。通过平滑重启,PM2 会在不中断用户请求的情况下重启应用,保证高可用性。
使用平滑重启
pm2 reload my-app使用 pm2 reload 命令可以平滑重启应用。该命令会在不中断请求的情况下逐步重启应用的每个进程。
5. 自定义重启策略
PM2 还支持自定义的重启策略。例如,你可以通过事件监听来根据特定条件触发重启。你可以为应用设置自定义重启逻辑,基于事件(如数据库连接失败、API 请求错误等)触发重启。
自定义重启事件
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 都提供了灵活的方式来帮助你管理应用的生命周期,确保系统在高负载和高压力情况下仍然能够稳定运行。