升级Rails应用至Heroku-18后,如何解决H-10应用崩溃错误?
Heroku-18迁移后Rails应用H10崩溃排查思路
问题背景
原部署在Heroku-14上的Rails应用,配置为Ruby 2.1.2 + Rails 4.1.6,迁移至Heroku-18时升级为Ruby 2.7.7 + Rails 5.2.2。应用本地运行正常,但部署到Heroku后触发**H10(App crashed)**错误,日志仅显示进程退出状态1,无详细报错信息。
已完成验证:
heroku pg:info显示数据库状态正常heroku run rake db:migrate执行成功heroku pg:psql可正常连接数据库- 本地通过psql命令远程连接数据库超时(属于Heroku数据库防火墙正常限制)
排查步骤
1. 获取完整启动日志
默认日志可能被截断,通过以下方式捕获详细报错:
- 仅查看应用进程的实时日志:
heroku logs --source app --tail - 手动启动Web进程,直接查看启动时的所有错误:
(注:此命令启动的进程不绑定Heroku路由,但能输出完整启动堆栈)heroku run rails server
2. 验证Ruby/Rails版本与依赖兼容性
- 确认Heroku上的Ruby和Rails版本与本地一致:
heroku run ruby -v heroku run rails -v - 检查Gem依赖是否完整或存在冲突:
heroku run bundle check - 检查Rails 5.2的配置适配:
- 将
config/environments/production.rb中Rails 4.x特有的config.serve_static_assets替换为config.public_file_server.enabled = true - 确保
config/database.yml使用Heroku自动注入的环境变量,配置示例:production: url: <%= ENV['DATABASE_URL'] %>
- 将
3. 显式配置Procfile
虽未设置Procfile时Heroku会使用默认启动命令,但显式定义可避免版本兼容问题:
- 在项目根目录创建
Procfile,内容为:
(若原应用使用Unicorn,替换为对应启动命令)web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-production} - 提交并重新部署:
git add Procfile && git commit -m "Add explicit Procfile for Heroku" && git push heroku main
4. 验证应用内数据库连接
确认应用在Heroku内部能否正常连接数据库:
heroku run rails runner "puts ActiveRecord::Base.connection.active?"
返回true则连接正常;若失败,检查DATABASE_URL环境变量:
heroku config:get DATABASE_URL
5. 检查生产环境必需环境变量
- 确认
SECRET_KEY_BASE已设置(Rails 5.x强制要求):
若未设置,生成并添加:heroku config:get SECRET_KEY_BASErails secret heroku config:set SECRET_KEY_BASE=<生成的密钥> - 检查自定义环境变量(如第三方服务API密钥)是否全部配置。
6. 适配Heroku-18系统依赖
Heroku-18基于Ubuntu 18.04,部分旧Gem可能依赖特定系统库:
- 在项目根目录创建
Aptfile,添加所需依赖库示例:libpq-dev libxml2-dev libxslt1-dev - 提交并重新部署,解决Gem编译失败问题。
补充排查技巧
若以上步骤未定位问题,启用Rails调试级日志:
修改config/environments/production.rb:
config.log_level = :debug config.logger = Logger.new(STDOUT)
重新部署后查看日志,获取完整错误堆栈。
内容的提问来源于stack exchange,提问作者sb-devora
相关产品推荐
相关产品推荐

