I recently started playing around with Ruby on Rails 3.1 to see what all the hype was about.  I’ve been working on a website for our neighborhood and decided to use RoR for it so I can learn it.  Rather than going the Heroku route, I wanted to host the site on my Amazon EC2 instance running CentOS 5 64bit.  Getting it setup on my server was a bit of a chore mostly because CentOS doesn’t have the latest and greatest packages.  Here are the steps I took to get a Rails site up and running.

Ruby

The latest package offered by yum in CentOS 5 is too old to work with Rails 3.1 so we must build a newer one.

cd /tmp
wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p290.tar.gz
tar -zxvf ruby-1.9.2-p290.tar.gz
cd ruby-1.9.2-p290
./configure --prefix=/opt/ruby192 && make && make install
export PATH=$PATH:/opt/ruby192/bin
echo 'export PATH=$PATH:/opt/ruby192/bin' > /etc/profile.d/ruby192.sh

RubyGems

cd /tmp
wget http://rubyforge.org/frs/download.php/75309/rubygems-1.8.10.tgz
tar -zxvf rubygems-1.8.10.tar.gz
cd rubygems-1.8.10
ruby setup.rb

Rails

gem install rails

SQLite3

Although CentOS 5 has SQLite3 installed out of the box it is an older version so we must build a new one.

cd /tmp
wget http://www.sqlite.org/sqlite-autoconf-3070800.tar.gz
tar -zxvf sqlite-autoconf-3070800.tar.gz
cd sqlite-autoconf-3070800
./configure --prefix=/opt/sqlite3 && make && make install

Passenger

Phusion Passenger makes running rails apps with Apache a cinch.  Run the following:

gem install passenger
passenger-install-apache2-module

The installation has nice walk-through instructions.  Basically, after the install, you will be placing the following in a new apache config file such as /etc/httpd/conf.d/rails_whatever.conf

LoadModule passenger_module /opt/ruby192/lib/ruby/gems/1.9.1/gems/passenger-3.0.9/ext/apache2/mod_passenger.so
PassengerRoot /opt/ruby192/lib/ruby/gems/1.9.1/gems/passenger-3.0.9
PassengerRuby /opt/ruby192/bin/ruby

<VirtualHost *:80>
 ServerName www.yourhost.com
 DocumentRoot /opt/somewhere/public    # <-- be sure to point to 'public'!
 <Directory /opt/somewhere/public>
   AllowOverride all              # <-- relax Apache security settings
   Options -MultiViews            # <-- MultiViews must be turned off
 </Directory>
</VirtualHost>

New Rails Site

cd /opt
rails new somewhere

So at this point I got a bundle error about problems installing sqlite-ruby. Don’t fret.  Add the following to /opt/somewhere/Gemfile below gem ‘rails’, ‘3.1.1’:

gem 'execjs'
gem 'therubyracer'

Now run the following:

bundle config build.sqlite3 --with-sqlite3-include=/opt/sqlite3 --with-sqlite3-lib=/opt/sqlite3
 --with-sqlite3-dir=/opt/sqlite3
bundle update
chown -R apache /opt/somewhere

Create Database

rake db:migrate RAILS_ENV="production"

Fire it Up

service httpd restart

Open a browser and go to www.yoursite.com.  If you see the Rails test page then you are up and running!