How can I get RVM/Passenger/Apache2 to play nicely together

Hello all,

Can anyone point me to any solid documentation on how to set up a
production server using RVM, Passenger, and Apache2? I have been at
this for a week with absolutely no luck at all so I thought I would
post here to see if anyone has managed to get this to work and written
down the steps they used.

Right now with my current implementation, I am getting a 404 error
when I attempt to locally point my browser to a basic rails
application.

I am attempting to set this up on an Ubuntu 11.10 system.

Any help would be greatly appreciated.

Thanks in advance.

Try the documentation from here:
http://www.mirceagoia.com/2011/11/ruby-on-rails-installation-ubuntu-linux-mint/

Mircea

Have you told Apache where to find your application?

-----Oprindelig meddelelse-----

Hi Brynjolfur,

Yes I believe I have. Here is what I have as my configs:

/etc/apache2/apache2.conf:

LoadModule passenger_module /home/vmcilwain/.rvm/gems/ruby-1.9.2-p290/
gems/passenger 3.0.11/ext/apache2/mod_passenger.so
PassengerRoot /home/vmcilwain/.rvm/gems/ruby-1.9.2-p290/gems/
passenger-3.0.11
PassengerRuby /home/vmcilwain/.rvm/wrappers/ruby-1.9.2-p290/ruby

/etc/apache2/sites-available/vell:

<VirtualHost *:80>`
    ServerName vell
    DocumentRoot "/home/lmcilwain/vell/current/public"
    ErrorLog "/var/log/apache2/vell-error_log"
    CustomLog "/var/log/apache2/vell-access_log" common
<Directory "/var/www/sites/vell/current/public">
    Options All
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>
RewriteEngine On
# Remove the www
RewriteCond %{HTTP_HOST} ^vell$ [NC]
RewriteRule ^(.*)$ http://vell/$1 [R=301,L]
</VirtualHost>

Thanks mg1313 I will take a look at this.

Hi Brynjolfur,

Yes I believe I have. Here is what I have as my configs:

/etc/apache2/apache2.conf:

LoadModule passenger_module /home/vmcilwain/.rvm/gems/ruby-1.9.2-p290/
gems/passenger 3.0.11/ext/apache2/mod_passenger.so
PassengerRoot /home/vmcilwain/.rvm/gems/ruby-1.9.2-p290/gems/
passenger-3.0.11
PassengerRuby /home/vmcilwain/.rvm/wrappers/ruby-1.9.2-p290/ruby

/etc/apache2/sites-available/vell:

<VirtualHost *:80>`
   ServerName vell
   DocumentRoot "/home/lmcilwain/vell/current/public"
   ErrorLog "/var/log/apache2/vell-error_log"
   CustomLog "/var/log/apache2/vell-access_log" common
<Directory "/var/www/sites/vell/current/public">
   Options All
   AllowOverride All
   Order allow,deny
   Allow from all
</Directory>
RewriteEngine On
# Remove the www
RewriteCond %{HTTP_HOST} ^vell$ [NC]
RewriteRule ^(.*)$ http://vell/$1 [R=301,L]
</VirtualHost>

Does Apache have permission to read that folder? Do you see anything in your Apache error log, or the system error log, related to access permissions on that particular Ruby binary?

I've only ever installed this combination on a server, and I use the "install as root" path through the RVM instructions in that case. It works perfectly for me when I do that, but since this is your dev box (I'm assuming) you might not want to do the same.

Walter

Hi Vell, I'm rather new to all this myself and have been going through all the usual installation woes.

I don't know if you have tried this but you could fire up Webbrick to see if the problem is with Apache or Rails. Go to the root of your Rails application (/home/lmcilwain/vell/current) and type:
$sudo rails server --port=88

Now you should see your Rails site running on port 88. If you don't, the problem is with Rails. Otherwise it is with Apache. The next thing to do would be to check Apache log files, they should give much better info on what went wrong.

Regards

Binni

-----Oprindelig meddelelse-----

The fact that these two paths don't match is suspicious to me. You'd
want both pointing at wherever it is on this that your app is.

Fred

Hi Walter,

I will confirm that Apache can read that directory when I get home.
When I looked at the process apache was running as root:www-data which
is what I set the permissions of the directory to. The Apache error
log and the access long didn't have any additional detail. As a matter
of fact the error log had the same statement as the browser window. I
did not think to check the system log to see if there were access
permissions to the ruby binary in my home directory. I will definitely
check that again once I get home.

This box would be used for production not development so installing it
as root I wouldn't have a problem with. I just remembered seeing
something on RVMs site about it not being the recommended approach for
one reason or another which is why I did not try it.

Thanks Binni, I will definitely give that a try as well to see if my
app is functioning properly.

That is a very good catch. I will certainly make that change as well.
I am at the point that I am also going to re-install ubuntu and start
from scratch just to eliminate any other possibilities that might be
happening behind the scenes. I will post my success of failure once I
am done.

Hi Vell,

Once you figure out that apache vhost path / read issue on your new
setup, ....

If you're using passenger and you're running rvm, then you're likely
using (or will use) different rubies and/or gemsets for projects on a
given machine. If so, then you might want to consider using passenger-
standalone instead of passenger-apache-module:

http://www.modrails.com/documentation/Users%20guide%20Standalone.html

The main benefit of running passenger-standalone is that you can run
multiple projects that use diff rubies/gemsets from the same apache (/
nginx/...). Here's an example setup from the phusion folks:

http://blog.phusion.nl/2010/09/21/phusion-passenger-running-multiple-ruby-versions/

I've been using passenger-standalone in production for over a year now
on a number of projects, and it works well. Those clients that use
passenger no longer use passenger-module and instead just use proxy'd
passenger-standalone for both their dev and prod envs.

Here's an example of the setup on a local dev instance for a given rvm
passenger-standalone project where I typically maintain an rvm gemset
per project:

####### localhost subdomain for the proj:
$ cat /etc/hosts
...
127.0.0.1 foo.localhost
...

###### vhost conf for the proj:

$ cat /etc/apache2/sites-available/foo.conf
#### http://foo.localhost/
<VirtualHost *:80>
  ServerName foo.localhost
  DocumentRoot /path/to/foo/public
  <Directory /path/to/foo/public>
    AllowOverride all
    Options -MultiViews
  </Directory>

  ProxyRequests Off
  <Proxy *>
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
  </Proxy>
  ProxyPass / http://127.0.0.1:3044/
  ProxyPassReverse / http://127.0.0.1:3044/
  RewriteEngine On
  RewriteCond %{LA-U:REMOTE_USER} (.+)
  RewriteRule . - [E=RU:%1]
  RequestHeader add X-Forwarded-User %{RU}e
  ProxyPreserveHost on

  CustomLog /var/log/apache2/foo_access_log combined
  ErrorLog /var/log/apache2/foo_error_log

  ErrorDocument 503 "<!DOCTYPE html><html><head><meta http-
equiv='Content-Type' content='text/html; charset=UTF-8' /><title>Foo
Service Is Temporarily Unavailable (503)</title></head><body><h2>Foo
Service Is Temporarily Unavailable (503)</h2><p>The Foo service is
temporarily unable to process your request due to maintenance
downtime.</p><p>Thanks for your patience. Please try again later.</p></

</html>"

</VirtualHost>

###### I usually have a custom script to
###### manage rails env server for proj:

$ pwd
/path/to/foo

$ cat ./script/foo_env_server.rb

Thanks for the insight. I think that setup makes a lot more sense.

Ok so I tried using the scenario that the phusion blog wrote out but I
am still getting a permission denied. I have a freshly installed
ubuntu 11.10 system so now I am sure that whats going on is related to
one install and not several different install attempts. SOOOO here is
what I have.

Reference Tutorial:
http://www.google.com/url?sa=D&q=http://blog.phusion.nl/2010/09/21/phusion-passenger-running-multiple-ruby-versions/&usg=AFQjCNGMN5oWTn9Sf7yHwK33id7p7PJ-KQ

The difference I did from this tutorial is that I wanted rails 1.9.2
to be the default since I won't be running any 1.8.7 apps.

Install goes as follows:
1. Installed rvm (single user)
-- For whatever reason when installed multi-user I was not able to
load rvm into my terminal after logging in/out
2. Installed ruby 1.9.2
-- rvm install 1.9.2
3. Made 1.9.2 the default
-- rvm --default use 1.9.2

4. Added the following to /etc/apache2/apache2.conf:

LoadModule passenger_module /home/vmcilwain/.rvm/gems/ruby-1.9.2-p290/
gems/passenger-3.0.11/ext/apache2/mod_passenger.so
   PassengerRoot /home/vmcilwain/.rvm/gems/ruby-1.9.2-p290/gems/
passenger-3.0.11
PassengerRuby /home/vmcilwain/.rvm/wrappers/ruby-1.9.2-p290/ruby

<VirtualHost *:80>
        ServerName vmcilwain-dell
        DocumentRoot /home/vmcilwain/sites/vell
</VirtualHost>

Unfortunately for some reason I am not able get to rubygems.org or
github.com so I am not able to run bundle to get all of the necessary
gems installed. I get the following error:
Fetching source index for http://rubygems.org/
Fetching source index for http://github.com/
Could not reach rubygems repository http://rubygems.org/, http://github.com/

The weird thing is that I am able to ping both domains. Also when I
create a brand new rails app bundle runs fine so I am curious about
what it does not like about my Gemfile this time around that it had no
problem with the last 5 times I have run it for that particular app.

With the fresh rails app that I have just created I am not able to
create the database using rake db create it is also giving me an
error:

vmcilwain@vmcilwain--D610:~/vell_new$ bundle exec rake db:create
rake aborted!
Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs
for a list of available runtimes.

(See full trace by running task with --trace)

I do have gem 'execjs' in my Gemfile so I am not sure exactly what I
am doing wrong in this case either.

Hi Vell

Doing a reinstall might well save you a lot of hassle. In my last install I used sudo all the way through (the server is a test server for an eventual production server) and no RVM since I was only going to use Ruby 1.9.2 (like you). I wrote down all the steps during the install and this "recipe" works well enough for me. Note that all apt-get installs use sudo, no doubt there are some places where that was unnecessary - but I couldn't be bothered to find out. The server also has Asterisk installed, you probably don't need that so I've commented out those lines that are Asterisk specific (with ##) but left them in the recipe anyway:

During install, Ubuntu 11.10, following packages selected:
OpenSSH server
LAMP server

$sudo visudo
  ##added last line:
  <my user name> ALL=(ALL) NOPASSWD: ALL

$sudo apt-get update
$sudo apt-get upgrade

##$sudo apt-get install asterisk sox asterisk-mysql asterisk-mp3

$sudo apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion

$sudo apt-get install ruby1.9.2
$ruby -v
>ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]
$gem -v
>1.3.7

$sudo gem update

$sudo env REALLY_GEM_UPDATE_SYSTEM=1 gem update --system
$gem -v
>1.8.12
$sudo apt-get install ruby1.9.1-dev
##see: http://rbjl.net/20-rubybuntu-2-troubleshooting-common-ruby-ubuntu-problems

$sudo gem install rails -v=3.1.0
$rails -v
>Rails 3.1.0
$rake --version
>rake, version 0.9.2

$sudo gem install passenger
$sudo passenger-install-apache2-module
$sudo apt-get install libcurl4-openssl-dev
$sudo apt-get install apache2-prefork-dev
$sudo apt-get install libapr1-dev
$sudo passenger-install-apache2-module

$sudo vim /etc/apache2/apache2.conf
##Added these lines at bottom of file:

LoadModule passenger_module /usr/lib/ruby/gems/1.9.1/gems/passenger3.0.11/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.9.1/gems/passenger-3.0.11
PassengerRuby /usr/bin/ruby1.9.1

$sudo service apache2 restart

##$sudo gem install adhearsion
##$ahn -v
## >Adhearsion v1.2.3

$sudo apt-get install phpmyadmin

##Install java runtime:

$sudo apt-get install python-software-properties
$sudo add-apt-repository ppa:chris-lea/node.js
$sudo apt-get update
$sudo apt-get install nodejs

##### END install - and everything works fine #####

-----Oprindelig meddelelse-----

Mircea,

I tried this installation guide just now and I am still in the same
place. Though the instructions are clear, I am still not able to get
to my rails application that is located in my home directory. This is
on a fresh installed Ubuntu 11.10 system as well. So here is what has
been done, based on that guide:

RVM Steup
sudo aptitude install build-essential git-core curl

bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)

echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/
rvm"' >> ~/.bashrc

rvm notes

sudo aptitude install build-essential openssl libreadline6
libreadline6-dev zlib1g zlib1g-dev zlib
libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-
dev libxslt-dev autoconf libc6-dev
ncurses-dev automake libtool bison

rvm install 1.9.2

rvm use 1.9.2

rvm --default use 1.9.2

RAILS SETUP 1
gem install rails

Added the following to my Gemfile
gem 'execjs'
gem 'therubyracer'

bundle install

rails s (saw my application locally on port 3000)

APACHE2 Setup

sudo aptitude install apache2

Passenger Setup

gem install passenger

passenger-install-apache2-module

Added the following to /etc/apache2/apache2.conf
LoadModule passenger_module /home/user/.rvm/gems/ruby-1.9.2- p290/gems/
passenger-3.0.11/ext/apache2/mod_passenger.so
PassengerRoot /home/user/.rvm/gems/ruby-1.9.2-p290/gems/
passenger-3.0.11
PassengerRuby /home/user/.rvm/wrappers/ruby-1.9.2-p290/

restarted apache2

Creating My Site

Created directory www in my home directory

rails new site -d mysql

Added the following to /etc/apache2/sites-available/site
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot /home/vmcilwain/www/site/public
</VirtualHost>

sudo a2ensite site

sudo a2enmod rewrite

sudo service apache2 reload

Attempted to hit the application with the browser (http://localhost)
and I get: It Works! (Apache standard page)
Attempt to hit the application with the location http://localhost/site
and I get: Not Found The requested URL /site was not found on this
server

According to the guide, I should have seen the welcome aboard page of
the site application in my www directory.

I can't be this hopeless, what else can I be doing wrong :-/ Any help
again is greatly appreciated.

Brynjolfu,

Thanks, I will also give this a shot. I have to think there is just
something fundamentally wrong that every installing attempt has
failed. All of the steps look pretty straight forward yet I am not
having any kind of success.

rails new site -d mysql

Added the following to /etc/apache2/sites-available/site
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot /home/vmcilwain/www/site/public
</VirtualHost>

sudo a2ensite site

sudo a2enmod rewrite

sudo service apache2 reload

Attempted to hit the application with the browser (http://localhost)
and I get: It Works! (Apache standard page)
Attempt to hit the application with the location http://localhost/site
and I get: Not Found The requested URL /site was not found on this
server

According to the guide, I should have seen the welcome aboard page of
the site application in my www directory.

Actually, with the setup you've got the rails app should be available at http://localhost (you have to add extra stuff to mount a rails app in a subdirectories)

Do you already have other sites hosted on this machine? Sounds like a different virtual host file (which is just serving up the stock apache page) is taking precedence.
With your setup you'll also need to ensure that both the app is readable by apache as well as all the rvm installed files

Fred

There aren't any other sites defined on this box. It is a fresh
install with nothing done to it aside from this latest attempt. I
would think that RVM has access to my files in my home directory since
it is installed under my account. As far as apache goes, it is running
as www-data. Is it that I just need to add www-data to the vmcilwain
group? or should I just make the app itself world readable to make it
simple?

There aren't any other sites defined on this box. It is a fresh
install with nothing done to it aside from this latest attempt. I
would think that RVM has access to my files in my home directory since
it is installed under my account. As far as apache goes, it is running
as www-data. Is it that I just need to add www-data to the vmcilwain
group? or should I just make the app itself world readable to make it
simple?

Clearly there is another virtual host file somewhere, since that welcome to apache file must be coming from somewhere. Probably also worth checking that the symlinks from sites-enabled are ok (I assume that's what a2ensite does - I'm not familiar with that particular way of managing apache.)

Apache will need to be able to read the rvm files and the app files. The simplest thing to do in the short term would be to make them both world readable

Fred