Deploying Ruby on Rails on Ubuntu Feisty Fawn via Mongrel and Apache
Note:
- Once again, another quick, down and dirty solution. The guys behind mongrel have even written up how to set it up. This is a more condensed form, and suited for Ubuntu Feisty Fawn
- This is not the best solution for deployment, but it works if you want to do early testing/deployment for clients. An ideal solution would be utilizing
capistranoandmongrel_cluster. - After installing
mongrel, when executing./script/server, you will not useWebrickanymore, but insteadmongrelfor development. You can still useWebrickif you want, but there isn't much of a difference. - This requires the use of RubyGems. If you don't have it installed, see my guide on setting up Rails using RubyGems.
Plan of Attack:
- Install and test Mongrel
- Install and test Apache
- Additional tips
- Mongrel Service
- Let Apache handle Requests for Static Files
- After thoughts
Install Mongrel
Enter into the Terminal:
[block:terminal]
sudo apt-get install ruby1.8-dev build-essential
sudo gem install -y mongrel
[/block]
Note: If you see the following make sure you select the latest version of mongrel for ruby. In this case option 2.
[block:terminal]
Select which gem to install for your platform (i486-linux)
1. mongrel 1.0.1 (mswin32)
2. mongrel 1.0.1 (ruby)
3. mongrel 1.0 (mswin32)
4. mongrel 1.0 (ruby)
5. Skip this gem
6. Cancel installation
>
[/block]
Testing Mongrel
Go into your rails application root directory, and execute:
[block:terminal]
mongrel_rails start -p 8000
[/block]
Open up your webbrowser and go to http://localhost:8000 and your application should load.
Note: mongrel_rails has alot of command line options. Executing mongrel_rails -h will get you more information.
Install Apache
Enter into the Terminal:
[block:terminal]
sudo apt-get install apache2
sudo a2enmod proxy_http
[/block]
You'll need change one file, specifically /etc/apache2/mods-available/proxy.conf
Look for the following line, it should be on line 11:
[block:file]
#Allow from .example.com
[/block]
and replace it with:
[block:file]
Allow from all
[/block]
Now as root, open up /etc/apache2/sites-available/railsapp [image16x16:file].
Enter the following:
[block:file]
<VirtualHost *>
ServerName railsapp.com
ServerAlias www.railsapp.com
ProxyPass / http://www.railsapp.com:8000/
ProxyPassReverse / http://www.railsapp.com:8000/
ProxyPreserveHost on
</VirtualHost>
[/block]
Note: replace railsapp.com and www.railsapp.com with the actual domain/ip you will be using.
Enable the site and restart Apache
[block:terminal]
sudo a2ensite railsapp
sudo /etc/init.d/apache2 restart
[/block]
Testing Apache
Fire up your browser. go to your site. It should be up and running.
Troubleshooting: If you get 403 forbidden, try removing the default site ( [image16x16:terminal] sudo a2dissite default) and change the (www.)railsapp.com setting to localhost. Optionally remove the lines containing ServerName and ServerAlias.
Additional Tips
mongrelwill need to be started up again, when you reboot your machine. We will cover setting it up as a service further down.mongrelcan be given flags to run under a different environment. Perhaps for simple production sites.- If two people try to access the site at the very same time, expect slight delays as only one intsance of
mongrelis running. - From now on
mongrelwill handle all requests. But this is a daft, as Apache can easily handle requests for static files: javascript, stylesheet and images. For solution view further down. - If you want to deploy more than one rails application you'll have to specify a
ServerName, and ensure that mongrel is using different ports
Mongrel Service
There are some tips online on how to setup a mongrel service.
I like the second one by Bojan Mihelac as you can customize the default port, and the environment the mongrel instance is running in.
Here it is reproduced, make sure to install it in /etc/init.d/mongrel [image16x16:file]. Then you can start it by executing /etc/init.d/mongrel start [image16x16:terminal]. Works with start, stop, and restart.
#!/usr/bin/env ruby
#
# mongrel Startup script for Mongrel by Tim Morgan, modified by bmihelac
#
# chkconfig: - 85 15
# description: mongrel manages Mongrel
#
# this would add one mongrels for these two apps on
# ports 8000 and 8001, mephisto would be started in production
apps = [
{:app => 'myapp'},
{:app => 'mephisto', :environment => 'production'},
]
default_port = 8000
default_options = {
:app_dir => '/home/rails',
:environment => 'production'
}
if ['stop', 'restart'].include? ARGV.first
apps.each do |app|
options = default_options.merge(app)
path = File.join options[:app_dir], options[:app]
puts "Stopping #{path}..."
`mongrel_rails stop -c #{path} -P log/mongrel.pid`
end
end
if ['start', 'restart'].include? ARGV.first
apps.each do |app|
options = default_options.merge(app)
path = File.join options[:app_dir], options[:app]
port = options[:port] || default_port
puts "Starting #{options[:app]} on #{port}..."
`mongrel_rails start -d -p #{port} -e #{options[:environment]} -c #{path} -P log/mongrel.pid`
default_port = port + 1
end
end
unless ['start', 'stop', 'restart'].include? ARGV.first
puts "Usage: mongrel {start|stop|restart}"
exit
end
Letting Apache handle Requests for Static Files
Include this into your railsapp file [image16x16:script], inside the <VirtualHost>
[block:file]
ProxyPass /images !
ProxyPass /stylesheets !
#continue with other static files that should be served by apache
Alias /images /path/to/public/images
Alias /stylesheets /path/to/public/stylesheets
#continue with aliases for static content
[/block]
Note: Ensure that the /path/to/public is readable by Apache
After thoughts
Using Mongrel for light sites is alright but it doesn't scale well. Thats why we have mongrel_cluster to the recuse.

June 2nd, 2007 - 08:56
Very damn cool. Thanks a bunch.
October 6th, 2007 - 13:20
Very useful init.d service script. Thanks a lot.
September 27th, 2008 - 03:37
Nice. Mod_rails is nice, too