Rails en producción - Parte 6 - Cluster de mongrels

ruby, rails, sysadmin Deja un comentario

Ya sólo nos queda configurar un cluster de mongrels y apuntar hacia ellos el servidor web nginx. Supongamos que vamos a arrancar 4 mongrels, tal y como representamos en la figura de la primera parte parte de este tutorial. Los mongrels escucharán en los puertos 8000 a 8003.

Para configurar el cluster hacemos:

$ mongrel_rails cluster::configure -e production -p 8000 -N 4 -c /var/miaplicacion/current -a 127.0.0.1
** Ruby version is not up-to-date loading cgi_multipart_eof_fix
Writing configuration file to config/mongrel_cluster.yml.

Este comando habrá creado el fichero config/mongrel_cluster.yml. Lo editamos y añadimos al final sendas líneas indicando el usuario y el grupo que ejecutarán los mongrels. Como ya indicamos, será un usuario no privilegiado el que ejecute tanto el servidor web como los mongrels:

cwd: /var/www/miaplicacion/current
log_file: log/mongrel.log
port: "8000"
environment: production
address: 127.0.0.1
pid_file: tmp/pids/mongrel.pid
servers: 4
user: usuario
group: usuario

Añadiremos el cluster de mongrels al arranque de la máquina:

sudo mkdir /etc/mongrel_cluster
sudo ln -s /var/www/miaplicacion/current/config/mongrel_cluster.yml /etc/mongrel_cluster/miaplicacion.yml
sudo cp /usr/lib/ruby/gems/1.8/gems/mongrel_cluster-1.0.5/resources/mongrel_cluster /etc/init.d
sudo chmod +x /etc/init.d/mongrel_cluster
sudo /usr/sbin/update-rc.d -f mongrel_cluster defaults
sudo ln -s /usr/bin/ruby1.8 /usr/bin/ruby

Y ya podremos arrancar y parar el cluster de mongrels:

$ sudo /etc/init.d/mongrel_cluster start
$ sudo /etc/init.d/mongrel_cluster stop

Ahora sólo nos queda apuntar el servidor web nginx a los mongrels. Para ello, editaremos el fichero /usr/local/nginx/conf/nginx.conf. Éste es un ejemplo básico del cual podemos partir.

user              miusuario miusuario;
worker_processes  4;
 
events {
    worker_connections  1024;
}
 
http {
    include           mime.types;
    default_type      application/octet-stream;
    sendfile          on;
    keepalive_timeout 65;
    gzip              on;
 
    upstream miaplicacion {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
    }
 
    server {
        listen       80;
        server_name  midominio.com;
 
        root   /var/www/miaplicacion/current/public;
        index  index.html;
 
        location / {
          proxy_set_header  X-Real-IP  $remote_addr;
          proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_redirect false;
 
          if (-f $request_filename/index.html) {
            rewrite (.*) $1/index.html break;
          }
 
          if (-f $request_filename.html) {
            rewrite (.*) $1.html break;
          }
 
          if (!-f $request_filename) {
            proxy_pass http://miaplicacion;
            break;
          }
        }
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

En la sección “upstream” apuntamos hacia los mongrels. En ella, “miaplicacion” es una etiqueta, la misma que usamos más abajo en la línea:

proxy_pass http://miaplicacion;

En la sección “server” cabe destacar que “root” apunta al directorio public de mi aplicación.

Rearrancamos nginx para que la nueva configuración surta efecto:

$ sudo /etc/init.d/nginx stop
$ sudo /etc/init.d/nginx start

Y ahora sí, por fin, tenemos que poder abrir desde nuestro navegador la URL:

http://midominio.com/

y acceder a nuestra aplicación. Si no tenemos configurado todavía la entrada en DNS, tendremos que poner la IP.

Como una última prueba, probaremos una vez más a rearracar la máquina y ver que todo arranca correctamente.

Tutorial completo

4 comentarios a “Rails en producción - Parte 6 - Cluster de mongrels”

  1. fguillen dice:

    Estupendo tuto.. sí señor.. muchas gracias.
    f.

  2. Javier Vidal Postigo dice:

    Muchas gracias :)

  3. Xurde dice:

    Hola, a dia de hoy tengo un servidor LAMP en Debian. Me estoy plantenado formatearlo y añadirle Rails.. Antes de toquetear nada y perder dos dias quiero tener lo conceptos lo mas claros posibles.
    Como se pone en produccion mas de una aplicacion?

  4. Guillermo Velasquez dice:

    Excelente post… definitivamente se merece un bookmark!!

Deja un comentario