Ruby on Rails on Apache and ISPConfig

Technical documentation

This article shows how you can install Ruby on Rails (RoR) and integrate it in Apache2 (including a short section at the end showing how to use RoR in a web site created with ISPConfig).

Ruby on Rails

Ruby on Rails is a web application framework which is rapidly gaining popularity among web programmers. It aims to increase the speed and ease with which database-driven web sites can be created and offers skeleton code frameworks (scaffolding) from the outset. Applications using the RoR framework are developed using the Model-View-Controller design pattern.

1. Initial Notes


2. Installing Ruby And Rails

  • Install Ruby and Ruby on Rails
apt-get install ruby libzlib-ruby rdoc irb rubygems rails eruby

3. Installing Apache2 And mod-fcgid

Ruby on Rails can be integrated in Apache2 using mod-fcgid.

  • Install the following packages:
apt-get install apache2 libapache2-mod-fcgid libfcgi-ruby1.8
  • Enable a few Apache modules:
a2enmod ssl
a2enmod rewrite
a2enmod suexec
a2enmod include
  • Reload Apache:
/etc/init.d/apache2 force-reload

4 Installing MySQL And The Ruby MySQL Bindings

  • Install the MySQL server and the Ruby MySQL bindings now:
apt-get install libmysql-ruby mysql-server
  • Set a root password for MySQL now (if one has not been set already)
mysqladmin -u root password yourrootsqlpassword

If MySQL is listening not only on, but on other addresses as well (e.g., you should set a root password for these addresses as well:

mysqladmin -h -u root password yourrootsqlpassword

5. Creating The Ruby On Rails Environment

  • Create a directory in which we want to develop our future RoR applications. I'd like to develop them in /var/rails, so I create that directory now:
mkdir /var/rails

Apache2 should have read/write access to that directory, so make the Apache user (www-data on Debian) and Apache group (again www-data) the owner and group of that directory:

chown -R www-data:www-data /var/rails

Now create a test RoR application called testapplication. We will create testapplication under the user www-data so that Apache has read/write access to it:

cd /var/rails
su -m www-data

Now that we're logged in as www-data, run

rails testapplication

This will create a directory called testapplication within /var/rails that contains all directories and files we need to develop our RoR application.

Next, we type in


to become root.

6 Modifying The Application's .htaccess File

The web folder of testapplication is /var/rails/testapplication/public. It contains an .htaccess file that we must modify so that Apache2 can run RoR applications using mod-fcgid.

vi /var/rails/testapplication/public/.htaccess
  • Comment out the AddHandler fastcgi-script .fcgi and AddHandler cgi-script .cgi lines
  • dd the line AddHandler fcgid-script .fcgi
  • Also comment out the line RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
  • Add the line RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

(note that it's now dispatch.fcgi instead of dispatch.cgi). Afterwards, the file should look like this:

# General Apache options
#AddHandler fastcgi-script .fcgi
#AddHandler cgi-script .cgi
AddHandler fcgid-script .fcgi
Options +FollowSymLinks +ExecCGI

# If you don't want Rails to look in certain directories,
# use the following rewrite rules so that Apache won't rewrite certain requests
# Example:
#   RewriteCond %{REQUEST_URI} ^/notrails.*
#   RewriteRule .* - [L]

# Redirect all requests not available on the filesystem to Rails
# By default the cgi dispatcher is used which is very slow
# For better performance replace the dispatcher with the fastcgi one
# Example:
#   RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
RewriteEngine On

# If your Rails application is accessed via an Alias directive,
# then you MUST also set the RewriteBase in this htaccess file.
# Example:
#   Alias /myrailsapp /path/to/myrailsapp/public
#   RewriteBase /myrailsapp

RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

# In case Rails experiences terminal errors
# Instead of displaying this message you can supply a file here which will be rendered instead
# Example:
#   ErrorDocument 500 /500.html

ErrorDocument 500 "<h2>Application error</h2>Rails application failed to start properly" 

7. Creating A Virtual Host For Our RoR Application

(If you use ISPConfig, please go to chapter 8!)

Now it's time to create an Apache vhost for our application. I will use the hostname so that our application can be reached under (assuming that points to the correct IP address).

The easiest way to create such a vhost is to replace the existing default vhost in /etc/apache2/sites-available/default (assuming that this default vhost isn't needed!):

cp /etc/apache2/sites-available/default /etc/apache2/sites-available/default_old
cat /dev/null > /etc/apache2/sites-available/default
vi /etc/apache2/sites-available/default
<Virtualhost *:80>
   DocumentRoot /var/rails/testapplication/public/

   <Directory /var/rails/testapplication/public>
      Options ExecCGI FollowSymLinks
      AllowOverride all
      Order allow,deny
      Allow from all

Of course, instead of replacing the default vhost, you can simply add your vhost at the end of /etc/apache2/sites-available/default so that you keep the default vhost.

Restart Apache:

/etc/init.d/apache2 restart

Next we open in a browser. We should see the default RoR page:

That's it! Now we can start to develop our RoR application in the /var/rails/testapplication directory.

8. RoR And ISPConfig

(If you don't use ISPConfig, skip this chapter!)

In this chapter I assume that you have created a web site called with the document root /var/www/web1/web in ISPConfig, and that your RoR testapplication is still in /var/rails/testapplication.

To make our RoR testapplication available in the vhost which we have created in ISPConfig, do the following:

  • Put the following lines into the Apache Directives field of the web site in ISPConfig:
<Directory /var/www/web1/web>
  Options +ExecCGI +FollowSymLinks
  AllowOverride all
  • Rename /var/rails/testapplication/public to /var/rails/testapplication/web
  • Copy the contents of /var/rails/testapplication to /var/www/web1
  • Make the Apache user the owner of /var/www/web1/web
cd /var/rails/testapplication
mv public web
cp -pfr * /var/www/web1
chown www-data:web1 /var/www/web1/web

That's it. The RoR application should now work in the vhost created in ISPConfig.