Ruby on Rails on Apache and ISPConfig
Technical documentation
01/12/2013
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¶
Hostname testapplication.example.com
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 127.0.0.1, but on other addresses as well (e.g. server1.example.com), you should set a root password for these addresses as well:
mysqladmin -h server1.example.com -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
exit
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
andAddHandler 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 testapplication.example.com
so that our application can be reached under http://testapplication.example.com
(assuming that testapplication.example.com
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> ServerName testapplication.example.com DocumentRoot /var/rails/testapplication/public/ <Directory /var/rails/testapplication/public> Options ExecCGI FollowSymLinks AllowOverride all Order allow,deny Allow from all </Directory> </Virtualhost>
Of course, instead of replacing the default vhost, you can simply add your testapplication.example.com
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 http://testapplication.example.com
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 testapplication.example.com
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 testapplication.example.com
vhost which we have created in ISPConfig, do the following:
- Put the following lines into the Apache Directives field of the
testapplication.example.com
web site in ISPConfig:
<Directory /var/www/web1/web> Options +ExecCGI +FollowSymLinks AllowOverride all </Directory>
- 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 testapplication.example.com
vhost created in ISPConfig.