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
相关产品推荐
相关产品推荐

