4

Using the following guide

http://spontaneousderivation.com/2012/09/30/rails-3-2-on-a-shared-dreamhost-server/

I managed to get my Rails 3.2.8 application with Ruby 1.9.3 up and running on Dreamhost shared hosting using fcgi (i know it is not the best solution, but I don't want to downgrade my applications to 3.0 and I lack skill and money for a VPS ).

Following the guides on DH wiki:

http://wiki.dreamhost.com/RMagick

http://wiki.dreamhost.com/Image_Magick#Compiling_ImageMagick_on_your_DreamHost_account

I installed my own version of ImageMagic and RMagic as a local gem.

However when I try to run application with RMagic functionality I get the following error in error.log:

'Premature end of script headers: dispatch.fcgi'.

I found out it is occurring when I uncomment the following line in my uploader:

include CarrierWave::RMagick

Running dispatch.fcgi from shell does not report any errors.

I assume that the problem might be caused by LD_LIBRARY_PATH or other env variables (listed in DH wiki) but tried including them in my .bashrc, .bash_profile and dispatch.fcgi but without effect.

Rob Kielty
  • 7,958
  • 8
  • 39
  • 51
pawurb
  • 516
  • 6
  • 19

2 Answers2

2

This solution is valid as of 3/7/2013. I just used it to deploy a new app to DH.

In your gemfile...

gem 'paperclip'

Then run "bundle install" from your app directory.

In your public/dispatch.fcgi...copy the code below and replace APPNAME with the name listed in your config/application.rb module, USER with your DH username, and RUBY with the specific ruby version listed in the output from "which ruby" on the command line on your DH ssh session.

#!/home/USER/.rvm/rubies/RUBY/bin/ruby

ENV['RAILS_ENV'] ||= 'production'
ENV['HOME'] ||= `echo ~`.strip
ENV['GEM_HOME'] = File.expand_path('~/.rvm/gems/RUBY')
ENV['GEM_PATH'] = File.expand_path('~/.rvm/gems/RUBY') + ":" +
File.expand_path('~/.rvm/gems/RUBY@global')

require 'fcgi' 
require File.join(File.dirname(__FILE__), '../config/environment.rb')

class Rack::PathInfoRewriter
def initialize(app)
@app = app
end

def call(env)
env.delete('SCRIPT_NAME')
parts = env['REQUEST_URI'].split('?')
env['PATH_INFO'] = parts[0]
env['QUERY_STRING'] = parts[1].to_s
@app.call(env)
end
end

Rack::Handler::FastCGI.run  Rack::PathInfoRewriter.new(APPNAME::Application)

No special processing is needed to get paperclip working assuming you have a valid install of RVM. Aside from the specifics I mentioned above (specifically the dispatch.fcgi is slightly changed), you can follow this guide, http://spontaneousderivation.com/2012/09/30/rails-3-2-on-a-shared-dreamhost-server/.

1

RMagick and ImageMagick are notorious for having compile / runtime issues. I recommend ditching RMagick in favor of something like MiniMagick. It looks like CarrierWave has a MiniMagick processor you can use instead: https://github.com/jnicklas/carrierwave/blob/master/lib/carrierwave/processing/mini_magick.rb

MiniMagick just shells out directly to the ImageMagick processes so you avoid the issues of linking to compiled binaries. In the past, RMagick was also known to be the source of memory leaks etc.

Also, you should seriously consider Heroku for deployment. A single dyno is free and I bet your experience will be much better.

TomDavies
  • 652
  • 4
  • 15