Apache + Mongrel + PHP

I’ve got an Apache + PHP website and I’d like it to work side by side with Rails using Mongrel. How do I configure httpd.conf (without using a cluster) to forward rails requests to Mongrel and let the php ones continue working as is? Is this possible?

Here’s the basic setup:

File system:

apache/htdocs - contains all the php scripts

railsproj/public - public rails project folder

HTTP settings:

http://www.example.com/ -> apache/htdocs

http://www.example.com:4000 -> railsproj/public


Shimon Amit

But doesn’t that mean that the end user has to enter the port number (www.example.com:4000) in his browser? How can I configure it so that
goes to the php parser and everything else goes to mongrel/rails?

Hmm, try setting up a proxy? In Apache, look at
http://httpd.apache.org/docs/2.0/mod/mod_proxy.html, especially at the
proxypass directive.

Shimon Amit wrote:

I've got an Apache + PHP website and I'd like it to work side by side with
Rails using Mongrel. How do I configure httpd.conf (without using a
cluster) to forward rails requests to Mongrel and let the php ones continue
working as is? Is this possible?



Thanks everybody. My goal was to setup a Ruby on Rails development environment on Windows XP allowing PHP and Rails to run side by side without clustering or proxying. Here’s my summary as to how I succeeded to setup the following development environment:

  • Windows XP

  • Xampp: Apache 2.0, PHP 5, MySQL 5

  • Ruby 1.8.5

  • Rails 1.1.6

  • Mongrel (gems: mongrel, mongrel_service)

Here’s how:


  1. First I installed XAMPP 1.5.0-pl1. I didn’t use the most recent version because of MySQL/Ruby compatibility Issues.


  1. Ruby 1.8.5 - One click installer


  1. Rails: At the command line: gem install rails –include-dependencies. I used to have Ruby 1.8.2 installed and with the version of RubyGems that it came with the gem commands used to freeze. I know things still aren’t too stable with Ruby on Windows, but after I upgraded to 1.8.5 the gem command started working nicely.

  2. Mongrel: gem install mongrel_service --include-dependencies. This will also install the mongrel gem. This gem will allow mongrel to run on Windows as a service.


  1. Apache. Append the following to the httpd.conf file. Notice that I used mod_rewrite rather than mod_proxy to forward requests to mongrel. (If this is a no no, I have yet to find out!) I didn’t want to have to configure a mongrel cluster.

<VirtualHost *:80>

DocumentRoot C:/path/to/rails/project

<Directory “C:/path/to/rails/project”>
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all

RewriteEngine On

RewriteRule ^(.+[^/])$ $1/ [R]

RewriteRule ^(.*)$ $1 [QSA,L]

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME}/index.html -f
RewriteRule ^(.*)$ $1/index.html [QSA,L]

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME}/index.php -f
RewriteRule ^(.*)$ $1/index.php [QSA,L]

RewriteRule ^(.*)[^/]$ $1/ [QSA,L]

RewriteRule ^/(.*)${REQUEST_URI} [P,QSA,L]

  1. Mongrel. This is a one-time command to run at the command prompt to install a mongrel service that will serve your rails application:

mongrel_rails service::install -N [name_of_service] -c [c:\path\to\rails\project] -p 4000 -e [development]

[name_of_service] - name of the Mongrel Windows service that will serve the rails project.

[c:\path\to\rails\project] - as it says.

[development] - this can be either ‘development’ or ‘production’. As you can guess, running on Windows with XAMPP, I was running a development environment.

  1. Rails. Configure your development database in [c:\path\to\rails\project]\config\database.yml.


  1. Command line: mongrel_rails service::start -N [name_of_service]

  2. Start Apache+MySQL with XAMPP Control Panel.

  3. Go to in your browser.


Local Development Environment


Faster Is Possible (Official mongrel documentation - mongrel.rubyforge.org)


Ruby On Rails List (Thanks Phillip)


Let me know if I’ve left anything out. I hope this thread will help newcomers overcome the difficulties of setting up Rails on Windows for the first time!


Shimon Amit

Shameless plug: Take a look at LiteSpeed. It allows you to do all
this and more. It's fast, free, and you don't need mongrel och
mongrel_cluster. Rails processes can spawn - quickly - just like PHP
processes, and the two can coinhabit the same server.

  / Peter

LiteSpeed definately looks like it has prospects, but it doesn’t run on Windows. I may try it with MS Virtual PC but I’m not quite there yet.

I had looked at LiteSpeed for a production app, and the commercial
version looks freaking fast. The free version looks about the same,
performance-wise, as lighttpd. Lighttpd also can serve both rails and
php through fcgi. Does litespeed have any advantages over lighttpd?

Peter Bengtson wrote:

Yes. You don't need to allocate a bunch of static FCGI workers. They
are spawned as needed, and you can control the maximum allowed number
of them. Also, configuring a Rails site is a doddle. As is multiple
Rails apps on one server. And it's configurable through a web interface.

No, no, no... proxying is how you are *supposed* to use Apache with
Mongrel. If you don't want use proxying then just browse directly to
the port # on which you are having Mongrel serve up your Rails app.


I don’t want to have to enter the port number. It is not elegant. Plus, I don’t want to make provisions for that type of URL pattern in the links (PHP links). The last line of the VirtualHost section above says:

RewriteRule ^/(.*)${REQUEST_URI} [P,QSA,L]

This is the line that rewrites all the rails requests to mongrel. Problem is, I can’t use ProxyPass rather than RewriteRule because it does not accept regular expressions. Do you have any suggestions? Plus, why is it preferable to use mod_proxy rather than mod_rewrite with Mongrel?



expressions. Do you have any suggestions? Plus, why is it preferable to use mod_proxy rather than mod_rewrite with Mongrel?

As I understand it, it's the API required... fcgi expects the web server to use that protocol which is handled by a web server module, and the rewrite is what triggers it.

OTOH, mongrel is a HTTP server; it expects the proxied http request. Why don't you want proxying? It's already available with apache... and it works well. We have php and rails w/ mongrel working in InstantRails...

David Morton
Maia Mailguard http://www.maiamailguard.com

I tried InstantRails but they don’t offer MySQL 5 which is a requirement. Regarding proxies, I have no objection to using them so long as I can use regular expressions (see post above) to filter requests. So far I’ve only had success with mod_rewrite and not with mod_proxy.