Monday, January 24, 2011

Run your rails application with apache2 and mongrel_clusters

Run your rails application with apache2 and mongrel_clusters

Install Apache 2.2 and enable the needed modules (url rewriting, proxy, proxy_balancer e proxy_http)

sudo apt-get install apache2

# enable your modules in apache
sudo a2enmod rewrite
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
sudo a2enmod proxy_connect

# if you not enabled any of the modules then may be errors occured while you restart your apache after adding the below configration
# Error may be encoutered it yoou have not enabled module rewrite is "Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration"

Install Mongrel, create a mongrel user, create the mongrel cluster
sudo gem install daemons gem_plugin mongrel mongrel_cluster --include-dependencies

You can continue with the same linux user to mongrel if you want otherwise you can create new user by
sudo /usr/sbin/adduser mongrel
This line creates new user mongrel withg same mongrel group
Now need to create one mongrel_cluster.yml
sudo mongrel_rails cluster::configure -e production -p 3010 -N 2 -c /home/user/projects/myapp -a --user mongrel --group mongrel

here -e = your working environment
     -p = your port for run application
     -N = Number of instances of the application. here 2 instances for my application and port is 3010. so this application will work on 3010 and 3011 port
 --user = need to provide your linuxuser
--group = need to provide your linuxgroup

this line will create /config/mongrel_cluster.yml file with following command
user: mongrel
cwd: /home/user/projects/myapp
log_file: log/mongrel.log
port: "3010"
environment: production
group: mongrel
pid_file: tmp/pids/
servers: 2

now make sure that tmp and log folder has permission to the user/group which you have user in mongrel_cluster if not assign permission by
sudo chown -R mongrel:mongrel /path/to/app/tmp

# Now start mongrel clusters
sudo mongrel_rails cluster::start

Hopefully clusters is worked perfactly and you can get it run on multiple port 3010 and 3011

Now need to set proxy balancer for this app
For this need to create one host for you app
Go to sudo nano /etc/hosts localhost myapp

Now need to configure Apache configuration file (sudo gedit /etc/apache2/sites-available/default).

NameVirtualHost *:80

#we need this as on Ubuntu/debian by default Proxy is not allowed
<Proxy *>
  Order allow,deny
  Allow from all

#Proxy balancer section (create one for each ruby app cluster)
  <Proxy balancer://myapp_cluster>
    BalancerMember http://myapp:3010
    BalancerMember http://myapp:3011

#Virtual host section (create one for each ruby app you need to publish)
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
        ServerName myapp  
        DocumentRoot /home/user/projects/myapp/public/
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    <Directory /home/debian/chirag/mycalltime/public/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from ::1/128

  #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
  RewriteRule ^/(.*)$ balancer://myapp_cluster%{REQUEST_URI} [P,QSA,L]


After configure the default file need to restart apache
sudo /etc/init.d/apache2 restart

You get your app running on multiple instanses with proxy balancer

1 comment:

  1. Nice Article, Thanks for this, this makes solve all my issue with configuration on mongrel with apache


Contact Me for any help regarding rails/nodejs/php/mysql


Email *

Message *