If you push your app and it crashes,
heroku ps
shows state crashed:
=== web (1X): `bundle exec thin start -R config.ru -e $RACK_ENV -p $PORT` web.1: crashed 2013/10/24 20:21:34 (~ 1h ago)check your logs to find out what went wrong.
Here are some common problems.
If your app failed to require a sourcefile, chances are good you’re running Ruby 1.9.1 or 1.8 in your local environment.
The load paths have changed in Ruby 1.9 which applies to Ruby 2.0.
Port your app forward to Ruby 2.0.0 making certain it works locally before trying to push to Cedar again.
Not all gems work with Ruby 2.0. If you hit an encoding error, you probably haven’t fully tested your app with Ruby 2.0.0 in your local environment.
Port your app forward to Ruby 2.0.0 making certain it works locally before trying to push to Cedar again.
If your app crashes due to missing a gem, you may have it installed locally but not specified in your Gemfile.
You must isolate all
local testing using bundle exec
.
For example, don’t run ruby web.rb
,
run
bundle exec ruby web.rbDon’t run
rake db:migrate
, run
bundle exec rake db:migrate.Another approach is to create a blank RVM gemset to be absolutely sure you’re not touching any system-installed gems:
$ rvm gemset create myapp $ rvm gemset use myapp
If you’re still missing a gem when you deploy, check your Bundler groups.
Heroku builds your app without the development
or test
groups, and if you app depends on a gem from one of these groups
to run, you should move it out of the group.
One common example using the RSpec tasks
in your Rakefile.
If you see this in your Heroku deploy:
$ heroku run rake -T Running `rake -T` attached to terminal... up, ps.3 rake aborted! no such file to load -- rspec/core/rake_taskThen you’ve hit this problem.
First, duplicate the problem locally like so:
$ bundle install --without development:test ... $ bundle exec rake -T rake aborted! no such file to load -- rspec/core/rake_taskNow you can fix it by making these Rake tasks conditional on the gem load. For example:
begin require "rspec/core/rake_task" desc "Run all examples" RSpec::Core::RakeTask.new(:spec) do |t| t.rspec_opts = %w[--color] t.pattern = 'spec/*_spec.rb' end rescue LoadError endConfirm it works locally, then push to Heroku.
Heroku does not support the use of Rack::Sendfile.
Rack:Sendfile usually requires that there is a frontend webserver like nginx or apache is running on the same machine as the application server.
This is not how Heroku is architected. Using the Rack::Sendfile middleware will cause your file downloads to fail since it will send a body with Content-Length of 0.