Como instalar un Cluster de servidores Apache con Raspberry Pi

Tras montar con éxito mi propio servidor web, accesible desde alteageek.homelinux.org , sirviéndome de una Raspberry 3, Raspbian, Mysql, Apache, Php y WordPress , y a la vista del número de visitas que esta recibiendo, hace unos días decidí ponerme como reto mejorar el servidor web, dotándolo de mayor potencia, de manera que pudiera atender un mayor número de peticiones simultáneas, y de un sistema que le aportara redundancia ante fallos.

La solución debía seguir estando basada íntegramente en la utilización de Raspberrys Pi, del sistema operativo Raspbian, de software libre, y ser fácilmente escalable, de manera que fuera fácilmente ampliable en cualquier momento.

Después de valorar distintas opciones decidí montar un sistema consistente en 3 Raspberry Pi, en la que una hiciera la función de balanceador/repartidor de carga, y las otras dos actuaran como servidores web.

Para ello hice uso de los siguientes componentes:

  • 1 Raspberry 3 funcionando como balanceador/repartidor de carga/peticiones.
  • 2 Rasberry 3  con copias idénticas de mi servidor web, pero con distintas direcciones IP.
  • Un hub Usb D-Link DUB-H4 con el que alimentar las 3 Raspberry.
  • 3 Cables 0.15m Micro USB a USB como de cables de alimentación.
  • Tarjetas SD Sandisk Extreme de 16 GBs.

El coste aproximado de todos los componentes unos 170 euros.

img_0946s

Pasos a seguir:

Configuración del balanceador de tráfico/carga:

El paso más importante en este proyecto es configurar el equipo que gestionará el reparto de la carga/visitas, algo que permitirá distribuir las visitas entre los equipos sobre los que actúe (en este ejemplo 2), además de aportar redundancia a fallos, ya que si uno de los servidores cae directamente redireccionará el tráfico al equipo restante.

Las Raspberry Pi tienen tan solo 1GB de memoria por lo que es importante hacer buen uso de ella. Dado que nuestra configuración no hará uso de entorno gráfico de ningún tipo, reduciremos la cantidad de memoria disponible por la tarjeta gráfica al mínimo (16mb), lo que permitirá a nuestro sistema contar con mayor memoria disponible. Para ello:

sudo raspi-config

en el menú que se abrirá iremos a la opción Advanced Options -> Split Memory

En esa opción reduciremos la memoria dedicada a la tarjeta gráfica al mínimo (16mb)

Al salir daremos el OK a guardar los cambios y reiniciar el sistema.

Al reiniciarse el sistema actualizaremos el software con:

sudo apt-get update
sudo apt-get upgrade

Asignaremos como IP por ejemplo 192.168.2.30 (explico como hacerlo en otro post).

E instalaremos Apache, que es el software que en este caso nos servirá para repartir el tráfico web entre nuestros dos servidores web:

sudo apt-get install apache2

Activando posteriormente los módulos que necesitamos:

sudo a2enmod lbmethod_byrequests slotmem_shm
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer

Para la configuración de este equipo como gestor del tráfico web necesitaremos editar el fichero de configuración:

sudo nano /etc/apache2/sites-available/000-default.conf

Cuyo contenido ha de ser el siguiente para un ejemplo de red en la que tanto el repartidor como los servidores web forman parte de la red 192.168.2.0 , y para un sistema en el que los servidores web tienen las direcciones 192.68.2.22 y 192.168.2.23:


# The ServerName directive sets the request scheme, hostname and port that
 # the server uses to identify itself. This is used when creating
 # redirection URLs. In the context of virtual hosts, the ServerName
 # specifies what hostname must appear in the request's Host: header to
 # match this virtual host. For the default virtual host (this file) this
 # value is not decisive as it is used as a last resort host regardless.
 # However, you must set it for any further virtual host explicitly.
 #ServerName www.example.com

 ServerAdmin webmaster@localhost
 DocumentRoot /var/www/html

 # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
 # error, crit, alert, emerg.
 # It is also possible to configure the loglevel for particular
 # modules, e.g.
 #LogLevel info ssl:warn

 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined

 # For most configuration files from conf-available/, which are
 # enabled or disabled at a global level, it is possible to
 # include a line for only one particular virtual host. For example the
 # following line enables the CGI configuration for this host only
 # after it has been globally disabled with "a2disconf".
 #Include conf-available/serve-cgi-bin.conf

ProxyRequests Off

<Proxy balancer://rpicluster>
        
    BalancerMember http://192.168.2.22:80
    BalancerMember http://192.168.2.23:80

    AllowOverride None
    Order allow,deny
    allow from all
    ProxySet lbmethod=byrequests

 </Proxy>


<Location /balancer-manager> 

   SetHandler balancer-manager
   Order allow,deny
   allow from 192.168.2
                
</Location>                
        
ProxyPass /balancer-manager !
ProxyPass / balancer://rpicluster/

 ErrorLog ${APACHE_LOG_DIR}/error.log
        

        # Possible values include: debug, info, notice, warn, error, crit,

        # alert, emerg.

        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

 


# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Una vez terminada la configuración, saldremos guardando los cambios pulsando Ctrl + X, y confirmando con Y.

Configuración de los servidores web:

No voy a explicar como instalar los servidores web porque ya lo hago en otro post.

Continuando con la configuración del cluster, y dando por hecho que los servidores web son copias idénticas con la única salvedad de sus direcciones IP, que siguiendo nuestro ejemplo serán 192.168.2.22 y 192.168.2.23, aumentaremos la memoria disponible en ambas de la misma manera que hemos hecho antes con la otra Raspberry:

sudo raspi-config

en el menú que se abrirá iremos a la opción Advanced Options -> Split Memory

En esa opción reduciremos la memoria dedicada a la tarjeta gráfica al mínimo (16mb)

Al salir daremos el OK a guardar los cambios y reiniciar el sistema.

Monitorización del gestor de carga:

Hay una herramienta web integrada en el propio servidor Apache que nos permite ver el estado del gestor de carga. Podemos acceder a ella tecleando en nuestro navegador la dirección del equipo que hace las funciones de gestor de carga seguida de /balancer-manager:

captura-de-pantalla-2016-11-30-a-las-20-36-58

En este panel de control, se nos muestra la disponibilidad de los dos servidores e incluso el tráfico que han tenido. Si hacemos click sobre la dirección de uno de los servidores podremos cambiar su configuración asignándole por ejemplo más tráfico, aunque conviene tener en cuenta que los cambios se perderán en el momento en que se reinicie el equipo.

Para que el cambio sea permanente y que por ejemplo al servidor 192.168.2.23 se le asigne el doble de visitas(carga), bastará con entrar en el servidor de carga,  editar el fichero de configuración con:

sudo nano /etc/apache2/sites-available/000-default.conf

y en la línea

 BalancerMember http://192.168.2.23:80

añadir

loadfactor=2

quedando de la siguiente manera:

BalancerMember http://192.168.2.23:80 loadfactor=2

Una vez terminada la configuración, saldremos guardando los cambios pulsando Ctrl + X, y confirmando con Y

Reiniciando a continuación el sistema para asegurarnos que los cambios surten efecto con:

reboot

Intentaré pulir este tutorial durante los próximos días, si mientras tanto necesitáis ayuda no dudéis en contactarme.

Salu2

Santi

Esta entrada fue publicada en Raspberry Pi, Seguridad y Redes y etiquetada , , , , , , , , , , , , . Guarda el enlace permanente.

10 respuestas a Como instalar un Cluster de servidores Apache con Raspberry Pi

  1. Jordi dijo:

    Hola Santiago.

    Estoy siguiente el tutorial para hacerme un cluster en casa de RaspberryPi.
    Ya tengo un servidor funcionando (para mi portfolio web)

    El caso es que (soy novatillo en Linux) no me queda claro dónde debo alojar la web.
    Quizá te suene estúpido lo que te comento, pero lo que he entendido es:

    1 raspberry controladora, donde se consultan las webs, es decir, las peticiones web las voy a hacer a esta dirección y es esta raspberry la que debo tener abierta al público. Por lo que he entendido esta no debe tener php, mysql, phpmyadmin, etc. instalado.

    El resto de raspberrys «esclavas» con todo instalado (apache, php, mysql, phpmyadmin, etc) y configurado por igual, es decir copias exactas. En mi caso estoy alojando los sitios en un disco duro externo, así que la duda de en qué raspberry alojo los sitios no es problema.

    ¿Es correcto esto?
    Si no lo es, ¿podrías hacerme un mapa de conceptos para entender el funcionamiento?
    He estado buscando información por todas partes pero no consigo resolver esta duda.

    ¡Gracias y buen trabajo!

    Me gusta

    • elalbir28 dijo:

      Es correcto aunque a continuación te hago unas matizaciones basadas en lo que sería la configuración que te recomiendo:

      – Si quieres facilitarte la tarea te recomiendo que como servidor de contenido uses WordPress. Lo tienes disponible gratis para Linux-Raspberry.

      – Partiendo de un supuesto de 4 Raspberries, la primera Raspberry, digamos 192.168.0.10 es la que repartirá el tráfico entre el resto. En ella basta con tener instalado Apache.

      – En las Raspberry 2 y 3, que podemos llamar 192.168.0.11 y 192.168.0.12 instalaremos Apache, Php, MySQL y WordPress, y se alojarán los datos de nuestra web.

      – En la cuarta Raspberry, que podemos llamar 192.168.0.20 instalaremos Apache, php, y Mysql, y en ella alojaremos la base de datos de WordPress, que es la que WordPress utilizará para guardar todos sus datos.

      Con esta configuración los datos fijos como fotos, videos y otros contenidos de ese tipo se alojan en cada Raspberry, en la carpeta elegida para alojar el contenido web. Para mantener ese contenido sincronizado con el resto de RPI te recomiendo usar rsync.

      El resto del contenido se aloja en la base de datos MySQL por lo que no tendrás que preocuparte de replicarlo.

      Me gusta

      • Jordi dijo:

        Gracias por la rápida respuesta.

        Entiendo que lo que propones es un servidor web por cada Raspberry, cada uno con un WordPress y una configuración por separado llamando al almacenamiento en otra Raspberry.

        Hago un inciso y te comento que no trabajo con WordPress. Casi todas las webs las hago a medida desde cero a no ser que me pidan un sistema específico, que últimamente me piden mucho Typo3 y Modified Shop.

        No me explayé demasiado y tampoco me expliqué bien en mi anterior mensaje, así que te voy a contar cómo lo quiero por si pudieras iluminarme un poco.

        Soy desarrollador web (+30 webs) y de plugins php y javascript y estoy cansado de pagar hostings para las páginas de prueba (desarrollo), por tanto he decidido alojármelas en casa. Así que mi idea era (dispongo de 4 raspberrys):

        – 1 raspberry controladora que distribuyera el tráfico de procesamiento php a las otras raspberrys, configurada con múltiples virtualhosts (+30)
        – 1 disco duro externo donde tener todo el alojamiento

        Actualmente lo tengo configurado en una, pero las páginas tardan bastante en realizar las peticiones, incluso en localhost, así que imagino que lo que le falta a la máquina es velocidad para procesar.

        No sé si me he explicado bien, como te dije anteriormente soy bastante novatillo en Linux y en servidores, por tanto el comportamiento lógico me es escaso.

        —-

        Viendo lo que neceseito y lo que me has explicado, puedo imaginar que sería algo así:

        RP1 -> Apache. Configurado el clúster que explicas arriba para distribuir procesamiento.
        RP2 -> Apache, PHP, MySQL, PhpMyAdmin. Configurado virtualhosts apuntando a disco duro externo.
        RP3 -> Copia integral de RP2.
        RP4 -> Copia integral de RP2.

        ¿Crees que sería esto correcto?

        ¡Gracias por tu tiempo!

        Me gusta

      • elalbir28 dijo:

        Eso exactamente. Si de paso quieres mayor rapidez usa tarjetas SD EXTREME (las doradas) y reducir la memoria de video al mínimo (dejando más ram disponible), puedes hacerlo con raspiconfig.

        Me gusta

      • Una pregunta, si cae la raspberry 4. La base de datos del servidor quedaría inutilizada? Es lo único que no me ha quedado claro. Cito textualmente donde tengo la duda:

        «En la cuarta Raspberry, que podemos llamar 192.168.0.20 instalaremos Apache, php, y Mysql, y en ella alojaremos la base de datos de WordPress, que es la que WordPress utilizará para guardar todos sus datos.»

        Gracias de antemano.

        Me gusta

      • elalbir28 dijo:

        Hola,

        disculpa el retraso. Efectivamente, así será en esta configuración en concreto. Para evitarlo puedes recurrir a tener la BBDD de Mysql repartida entre varios servidores.

        Me gusta

    • Jordi dijo:

      Sí, actualmente estoy usando unas SD amarillas de clase 10.
      Ya te diré si funciona 🙂
      Muchas gracias Santiago por los consejos y las guías.

      Me gusta

  2. Hugo Molina dijo:

    Excelente aporte y justo lo que necesito, solo se abre una duda referente a que si el servidor web usa una base de datos MySql, al direcciones a uno u otro esta base de datos no se actualizará en ambos servidores? o me equivoco? se tiene que montar una RPI con la base de datos a la que accedan ambos servidores web?? o hay alguna configuración para hacer que si el registro se realiza en un servidor el otro servidor actualice los datos en el?
    Espero se entienda la consulta

    Me gusta

    • elalbir28 dijo:

      Hola, efectivamente, te recomiendo montar el servidor en otra Rpi y que todas las peticiones le sean enviadas por un nodo u otro. He probado otras soluciones pero esta ha sido la más eficiente, montando(opcional) otra pi que actue como servidor mysql de backup, y vaya replicándose continuamente.

      Espero haberte ayudado.

      Me gusta

  3. Daniel dijo:

    Buenas! Alguien intentó este tutorial pero con la web en HTTPS en vez de HTTP? Estoy tratando de replicar este tutorial pero cuando intento acceder desde el balanceador con HTTPS tengo un Internal Server Error (The server encountered an internal error or misconfiguration and was unable to complete your request) Revisando el LOG de apache veo errores como » server certificate is a CA certificate» o » server certificate does NOT include an ID which matches the server name»

    Me gusta

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.