You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nest js服务在Heroku上持续崩溃,如何实现自动重启?

Heroku平台NestJS服务崩溃自动重启解决方案

1 启用Heroku原生自动重启机制

Heroku平台默认对所有dyno提供崩溃自动恢复能力:当检测到进程以非0状态码退出时,会自动触发重启,单小时内最多重启10次,超出阈值后会短暂冷却再继续尝试重启。
如果服务未触发默认重启,先检查package.json中的启动脚本是否正确配置为前台运行,NestJS生产环境标准启动配置为:
"start:prod": "node dist/main"
不要添加任何后台运行参数(如&、nohup等,会导致Heroku无法检测进程状态。

2 用PM2进程管理器增强重启能力

如果原生重启机制无法满足需求,可以使用PM2作为进程管理器,提供更丰富的异常场景覆盖,同时适配Heroku运行规则:

  • 安装PM2依赖:
    npm install pm2 --save
  • 项目根目录新增ecosystem.config.js配置文件:
module.exports = {
  apps: [
    {
      name: 'nest-service',
      script: 'dist/main.js',
      instances: 1,
      autorestart: true,
      watch: false,
      max_memory_restart: '512M',
      env: {
        NODE_ENV: 'production',
      },
    },
  ],
};
  • 修改package.json生产启动脚本:
    "start:prod": "pm2-runtime start ecosystem.config.js --env production"
    pm2-runtime是PM2专为PaaS平台设计的前台运行模式,除了崩溃自动重启外,还支持内存溢出重启、未捕获异常重启等能力。

3 根因排查避免反复崩溃

自动重启仅为兜底方案,建议先定位崩溃根源减少重启触发:

  • 执行heroku logs --tail查看实时运行日志,定位具体错误原因
  • 确认端口配置符合Heroku要求,不可写死固定端口,必须读取平台分配的环境变量端口:
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.PORT || 3000);
}
bootstrap();
  • 检查资源占用排查:免费层级dyno内存上限为512M,超出后会被系统主动杀死进程,内存占用过高可优化服务逻辑或升级dyno配置。

4 配置健康检查触发主动重启

可以配置健康检查接口,Heroku检测到接口异常时会主动重启dyno:使用@nestjs/terminus模块可快速实现标准化健康检查接口,配置后在Heroku后台对应应用的设置页绑定健康检查路径即可。

内容的提问来源于stack exchange,提问作者Abdul Samad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 04:48:01