如何调试Heroku上Node.js应用出现的H10应用崩溃问题
Heroku Node.js代理H10错误排查方案
你当前获取的标准H10错误日志仅代表Heroku路由器检测到应用进程已崩溃,不包含具体崩溃原因:
heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/ host=myapp.herokuapp.com fwd=17.17.17.17 dyno= connect= service= status=503 bytes=
可按照以下步骤定位根因:
一、定位应用崩溃具体位置
- 首先添加全局异常捕获逻辑,确保所有未处理错误都能输出完整堆栈到日志,Node.js侧添加如下代码:
// 捕获未处理的同步异常 process.on('uncaughtException', (err) => { console.error('未捕获异常:', err.stack) // 异常后优雅退出,避免进程在异常状态下运行 process.exit(1) }) // 捕获未处理的异步Promise reject process.on('unhandledRejection', (reason, promise) => { console.error('未处理Promise拒绝:', promise, '原因:', reason.stack || reason) })
- 开启实时日志抓取,本地运行
heroku logs --tail --app 你的应用名称,等待错误复现,此时捕获到的错误堆栈会直接显示崩溃发生的代码位置。 - 重点检查代理逻辑的异常处理分支:
- 是否对请求、响应对象的
error事件做了监听处理,客户端主动断开连接未处理会直接抛出异常 - 上游代理请求的超时、失败场景是否有兜底逻辑,未捕获的上游请求错误会直接导致进程崩溃
- 是否存在内存泄漏场景,比如未销毁的请求上下文、积压的未处理请求队列
- 是否对请求、响应对象的
二、排查是否为Heroku平台资源不足导致
Hobby dyno的资源限制会直接触发进程被平台强制关闭,进而抛出H10错误,可通过以下特征确认:
- 检查日志中是否存在R系列错误码:
- 出现
R14、R15错误代表内存占用超过Hobby dyno的512MB上限,进程被平台强制终止 - 出现
R12错误代表请求队列积压超出限制,进程无响应被平台回收
- 出现
- 若崩溃多发生在并发请求较高的时段,且日志无明确应用错误堆栈,基本可判定为Hobby dyno共享CPU、内存资源不足导致,可通过优化代理并发处理逻辑降低资源占用,或升级dyno配置解决。
内容的提问来源于stack exchange,提问作者fsallstrom
相关产品推荐
相关产品推荐

