如何修复Ruby on Rails应用在Heroku上的H10应用崩溃错误?
Rails应用Heroku部署后崩溃(H10错误)排查方案
问题概述
本地运行正常的Rails 7.0.7应用,部署到Heroku后触发H10崩溃错误,日志显示请求/cable后应用状态从up变为crashed。已尝试重启dyno、校验storage.yml格式、调整Procfile配置,但问题未解决。
关键日志信息
2023-10-30T14:40:44.484063+00:00 heroku[web.1]: State changed from up to crashed 2023-10-30T14:40:44.378048+00:00 heroku[router]: at=info method=GET path="/cable" host=j-a-m-1f39b9aba9a4.herokuapp.com request_id=2b4b5435-b40a-431c-b48f-1159fa5fd7fb fwd="86.182.36.176" dyno=web.1 connect=0ms service=107ms status=101 bytes=174 protocol=https 2023-10-30T14:41:19.466343+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/cable" host=j-a-m-1f39b9aba9a4.herokuapp.com request_id=41cf02af-42a1-43b5-9ac8-7d6fbf8ac59f fwd="86.182.36.176" dyno= connect= service= status=503 bytes= protocol=https
已执行操作
- 多次重启Heroku应用及Web dyno
- 确认
storage.yml格式正确 - 检查Heroku控制台未发现明显错误
- 调整Procfile配置后问题依旧
针对性排查与修复步骤
1. 校验Action Cable的Redis配置
从Gemfile看生产环境已引入redis gem,但需确保Action Cable适配器配置正确:
- 打开
config/cable.yml,确认生产环境指向Heroku Redis实例:
production: adapter: redis url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> channel_prefix: your_app_name_production
- 执行
heroku addons确认已添加Redis插件,未添加则执行:heroku addons:create heroku-redis:hobby-dev
2. 验证数据库配置
确保config/database.yml生产环境配置依赖Heroku环境变量:
production: adapter: postgresql encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> url: <%= ENV.fetch("DATABASE_URL") %>
- 执行
heroku run rails db:migrate确保数据库迁移完成,避免启动时因表缺失崩溃
3. 获取完整崩溃日志
当前日志仅显示状态变化,需定位具体崩溃原因:
- 执行
heroku logs --tail实时查看日志,重启应用后观察启动阶段报错 - 执行
heroku logs --ps web.1查看web进程完整日志,排查依赖缺失、配置错误或代码异常
4. 检查Puma配置
Procfile使用bundle exec puma -C config/puma.rb,需确认config/puma.rb适配Heroku环境:
- 确保端口监听使用Heroku提供的环境变量:
port ENV.fetch("PORT") { 3000 } environment ENV.fetch("RAILS_ENV") { "development" }
- 避免设置超出Hobby dyno资源限制的线程数、进程数
5. 确认依赖安装完整性
执行heroku run bundle check检查生产环境依赖是否全部安装,若有缺失则重置buildpack后重新部署:
git add . git commit -m "Fix dependency issues" git push heroku main
6. 排查Cloudinary配置
虽然已确认storage.yml,但需确保Heroku环境变量正确设置:
- 执行
heroku config查看是否存在CLOUDINARY_URL,缺失则添加:heroku config:set CLOUDINARY_URL=your_cloudinary_url
内容的提问来源于stack exchange,提问作者jtlwell
相关产品推荐
相关产品推荐

