# 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

Thanks,

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
www.example.com/[anything/].php
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?

Yes...

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:

INSTALLATIONS

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.

CONFIGURATIONS

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>

ServerName 127.0.0.1
DocumentRoot C:/path/to/rails/project

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

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])1/ [R]

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

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

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

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

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$http://127.0.0.1:4000%{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. INITIATIONS 1. Command line: mongrel_rails service::start -N [name_of_service] 2. Start Apache+MySQL with XAMPP Control Panel. 3. Go to 127.0.0.1 in your browser. RESOURCES Local Development Environment http://www.ridaalbarazi.com/blog/2006/06/21/local-development-environment-part-3/ Faster Is Possible (Official mongrel documentation - mongrel.rubyforge.org) http://mongrel.rubyforge.org/docs/apache.html Ruby On Rails List (Thanks Phillip) http://groups.google.com/group/rubyonrails-talk/msg/99b36051504f783f 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! Best, 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. Curt 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 ^/(.*)$ http://127.0.0.1:4000%{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?

Thanks,

Shimon

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
mortonda@dgrmm.net

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.