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:

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: J-_-L | 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