How to set up Rails with mod_fcgi
(Written by Sean Reifschneider, tummy.com, ltd., October 2, 2005)
The current (October 2005) recommendations for running rails seem to
be either to use Apache 1.3 with Fast CGI, or to use Lighttpd with FastCGI.
Most documents either say that Apache 2.x with mod_fcgid, the Apache 2.x
replacement for FastCGI, AKA fcgi and fcgid, does not work or they only go
so far as to say that it's rumored to work. Not entirely helpful.
I'd be more interested in trying lighttpd if it weren't for the fact
that Debian Testing doesn't have it. They'll have to get on it. In the
mean time, since I already have Apache2 running on this test site, I
decided to figure out Rails+mod_fcgid.
You will almost certainly need the Ruby "fcgi" module and Apache2
mod_fcgid modules. In Debian Testing these are packages named
"libapache2-mod-fcgid", and "libfcgi-ruby1.8".
Next, you will need to configure your Apache virtual site. In my
case, I'm using a name-based virtual, with my Rails site under /home/httpd.
My VirtualHost directive looks like:
NameVirtualHost 66.35.36.247:80
<VirtualHost 66.35.36.247:80>
ServerName www.example.com
DocumentRoot /home/httpd/WWW.EXAMPLE.CA/MYAPPNAME/public/
# Yes, referrer is mis-spelled, this is for legacy reasons
CustomLog /var/log/apache2/referer_log combined
# Note that you can't put this in the .htaccess
DefaultInitEnv RAILS_ENV production
<Directory /home/httpd/WWW.EXAMPLE.CA/MYAPPNAME/public/>
Options ExecCGI +FollowSymLinks
AllowOverride All
order allow,deny
allow from all
</Directory>
</VirtualHost>
Strings in all caps will likely need to be changed, but so will
"/home/httpd", depending on where you put your applications.
Next you need to modify the "MYAPPNAME/public/.htaccess" file so that
the "AddHandler fcgid-script .fcgi" at the top, and has a RewriteRule for
"dispatch.fcgi". Note that the default .htaccess file includes lines for
"fastcgi-script" and "dispatch.cgi", make
sure you don't mistake
"cgi" for "fcgi", it can be easy to do. Here are some excerpts from my
.htaccess file:
RewriteEngine On
# General Apache options
#COMMENTED OUT#AddHandler fastcgi-script .fcgi
#COMMENTED OUT#AddHandler cgi-script .cgi
AddHandler fcgid-script .fcgi
Options +FollowSymLinks +ExecCGI
[...]
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
#COMMENTED OUT#RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
[...]
That's pretty much it. You will, on Debian, have to make sure that
you have the "fcgid.*" and "rewrite.*" files linked from
"/etc/apache2/mods-available" into "mods-enabled" or the server won't be
able to find the modules for fcgid and rewrite -- both of which are
required:
cd /etc/apache2/mods-enabled
ln -s ../mods-available/fcgid.* .
ln -s ../mods-available/rewrite.* .
Of course, once you make these changes, you'll need to restart Apache
for the changes to take effect.