Node Express服务在Heroku staging正常但production偶发no such app错误
问题排查与解决方案
首先排除Heroku平台本身故障的可能
如果是Heroku平台故障,通常会出现全量请求失败、dyno无法启动等共性问题,不会出现同一路由偶发成功的现象,问题基本集中在应用启动配置、端口绑定或进程管理环节。
production环境需要调整的配置项
- 修正端口绑定逻辑:Heroku会为每个web dyno动态分配唯一的监听端口,强制要求进程监听
process.env.PORT环境变量对应的端口,你日志中硬编码监听12080属于错误配置。修改代码中端口监听逻辑为:
app.listen(process.env.PORT || 12080, () => { console.log(`Starting server in port ${process.env.PORT || 12080}`) })
本地开发时会自动 fallback 到12080,部署到Heroku时会使用平台分配的动态端口。
- 修正pm2启动配置:首先不要用pm2的后台守护模式启动应用,Heroku要求web进程必须在前台运行,否则平台会判定进程退出,触发dyno重启,导致服务不稳定。将
npm start的启动命令从pm2 start xxx改为pm2-runtime xxx,pm2-runtime是专门为容器、PaaS平台设计的前台运行模式,符合Heroku的运行要求。
其次不要配置pm2的多进程集群模式,Heroku单dyno只允许一个进程绑定监听端口,多进程模式会导致端口抢占,只有抢到端口的进程能正常处理请求,其他进程返回404,刚好符合你偶发成功的故障表现。 - 核对production环境变量:登录Heroku后台进入production应用的设置页,核对Config Vars配置,确保所有staging环境有的必要配置项production都存在,尤其注意
NODE_ENV等运行相关的变量是否和staging一致。 - 检查dyno运行状态:进入production应用的资源页,查看web dyno的运行日志,确认是否存在频繁重启、进程崩溃的记录,如果有则根据错误日志进一步排查依赖缺失、资源不足等问题。
内容的提问来源于stack exchange,提问作者Bill Rock
相关产品推荐
相关产品推荐

