Deploying two rails application with Apache + mongrel on windows
Posted by Bhushan Ahire | Posted in Rails | Posted on 28-01-2008
1
Install Ruby, Gems and then install Ruby on Rails:
sudo gem install rails --include-dependencies
Now download and install Apache 2.2 using, as the fastest way, the msi package.
Now enable the needed modules (url rewriting, proxy, proxy_balancer e proxy_http) by editing the httpd.conf file (under c:Apache_Software_FoundationApache2.2conf, if you installed Apache in its standard path). You just need to uncomment the following lines (remove the #):
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
Install the mongrel and mongrel_service gems:
gem install mongrel (pick last version for win32)
gem install mongrel_service (pick last version for win32)
Now we will create a mongrel cluster of 2 windows services responding at http://127.0.0.1 on ports 3010, 3011 serving a rail application at the path c:wwwrormyapp that will be started from the windows system user. The two windows services will be respectively named mongrel_myapp1 and mongrel_myapp2. Open the command prompt and type:
mongrel_rails service::install -N mongrel_myapp1 -p 3010 -e production -c c:wwwrormyapp
mongrel_rails service::install -N mongrel_myapp2 -p 3011 -e production -c c:wwwrormyapp
Now open the windows services tool, make the 2 new services have an automatic startup type (so they will still be started when you reboot).
Test if your application is now running at the two ports:
http://localhost:3010
http://localhost:3011
If everything is working fine, you are ready to place Apache in front of these 2 mongrel services, to manage the load balancing of you application.
The best way to configure Apache is to create a Virtual Host for your ROR application. First edit your httpd.conf file, and uncomment the following line:
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
Now edit the httpd-vhosts.conf file, like this (keep the slashes in the *nix fashion!):
NameVirtualHost *:80
#Proxy balancer section (create one for each ruby app cluster)
<Proxy balancer://myapp_cluster>
BalancerMember http://myapp:3010
BalancerMember http://myapp:3011
</Proxy>
#Virtual host section (create one for each ruby app you need to publish)
<VirtualHost *:80>
ServerName myapp
DocumentRoot c:/www/ror/myapp/public/
<Directory c:/www/ror/myapp/public/ >
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
#log files
ErrorLog /var/log/apache2/myapp_error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/myapp_access.log combined
#Rewrite stuff
RewriteEngine On
# Check for maintenance file and redirect all requests
RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ /system/maintenance.html [L]
# Rewrite index to check for static
RewriteRule ^/$ /index.html [QSA]
# Rewrite to check for Rails cached page
RewriteRule ^([^.]+)$ $1.html [QSA]
# Redirect all non-static requests to cluster
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ balancer://myapp_cluster%{REQUEST_URI} [P,QSA,L]
</VirtualHost>
Add your app as a host in hosts.file (in the c:WINNTsystem32driversetc folder):
127.0.0.1 localhost
127.0.0.1 myapp
Restart now Apache from the Windows services panel, and if everything is fine you should have your app served by Apache at the following url:
http://myapp

Great article! Works perfectly(almost). The only problem I had was where you specified the “ErrorLog /var/log/apache2/myapp_error.log” and “CustomLog /var/log/apache2/myapp_access.log combined”. I had to change it to “/apache/logs/myapp_error.log” and “/apache/logs/myapp_access.log combined”, respectively because I had installed Apache and c:/apache.
Question: any way to test that the work load is being distributed among the cluster?