UPDATE 2010-04-03: docgecko notes in the comments below that more recent versions of RVM now provide the passenger_ruby command for using RVM-installed versions of Ruby with Phusion Passenger. This article has been updated with the newer instructions, but RVM’s Passenger instructions are more likely to be up to date. Thanks for the update, docgecko.

I’ve recently starting using Ruby Version Manager (aka rvm) to manage multiple ruby versions on my workstation. So far I’m quite pleased with the ease of use. (My only gripe so far is that the rvm command is uncomfortably close to rm – it’s only a matter of time before I shoot myself in the foot).

There is one gotcha. In production I use Phusion Passenger in conjunction with Ruby Enterprise Edition. I would like to use the same environment in development. However, when installing the passenger gem into an rvm-managed ruby installation, the path to the ruby binary (which you need to plug somewhere into your Apache config) will not work. It will have an incorrect gem path, and in my case, that resulted in passenger failing to spin up because it was unable to load the fastthread gem.

/Users/jparker/.rvm/ruby-enterprise-1.8.6-20090610/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- fastthread (LoadError)
        from /Users/jparker/.rvm/ruby-enterprise-1.8.6-20090610/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from /Users/jparker/.rvm/gems/ruby-enterprise/1.8.6/gems/passenger-2.2.5/lib/phusion_passenger/utils.rb:28
        from /Users/jparker/.rvm/gems/ruby-enterprise/1.8.6/gems/passenger-2.2.5/bin/passenger-spawn-server:53:in `require'
        from /Users/jparker/.rvm/gems/ruby-enterprise/1.8.6/gems/passenger-2.2.5/bin/passenger-spawn-server:53

The solution is very clearly printed on the rvm web site. Instead of passing the path to the actual ruby binary to the PassengerRuby directive, pass in the RVM_ROOT/bin/passenger_ruby (replacing RVM_PATH with the root of your rvm installation [usually $HOME/.rvm]).

# Don't do this
PassengerRuby /Users/jparker/.rvm/ruby-enterprise-1.8.6-20090610/bin/ruby

# Do this instead
PassengerRuby /Users/jparker/.rvm/bin/passenger_ruby

The latter is a shell script which execs the actual ruby binary after setting an appropriate GEM_HOME and GEM_PATH (among other things).