Apache Tomcat 8 Proxy Balancer en Debian Jessie

Siguiendo con los Cluster´s y dado que ya hemos hecho uno simplemente de Apache que mejor que darle paso a Tomcat de que se presente de la misma forma!

El esquema sera el mismo que el expuesto para el Cluster Apache Proxy Balancer si no lo has visto te invito a visitar el post y ver los requisitos.

Comencemos!

1.- Instalación y configuración de Servidor Apache2 (Proxy)

Iniciaremos por el servidor Apache que nos hará de proxy para todos las peticiones HTTP:

NOTA!: recuerda que los comandos los coloco con el carácter especial # pero tu has de obviarlo!


apt-get update && apt-get -y upgrade
apt-get install -y apache2 libapache2-mod-jk

Después de esto al acceder desde tu navegador Web a la IP del servidor 192.168.1.30 tendrías que poder la Web por defecto de Apache en la que se te muestra información básica del mismo, algo como lo que sigue:

Ahora configuramos el archivo por defecto de Apache para habilitar el Balancer desde el mismo, editamos el archivo /etc/apache2/sites-enabled/000-default.conf y añadimos las siguientes lineas:


JkMount /status status
JkMount /* loadbalancer

Quedando de esta forma:

Perfecto, ahora vamos a configurar el archivo workers.properties donde se definen los nodos del Cluster Tomcat, en este caso y por defecto el archivo se encuentra en /etc/libapache2-mod-jk/workers.properties, pero crearemos un archivo nuevo y en otra ubicación para evitar complicaciones y le daremos los permisos respectivos:


touch /etc/apache2/workers.properties && chmod 755 /etc/apache2/workers.properties

Ahora lo editamos y añadimos los siguientes parámetros:

worker.list=loadbalancer, status

worker.tomcat1.port=8009
worker.tomcat1.host=192.168.1.41
worker.tomcat1.type=ajp13
worker.tomcat2.port=9009
worker.tomcat2.host=192.168.1.42
worker.tomcat2.type=ajp13

worker.tomcat1.lbfactor=1
worker.tomcat2.lbfactor=1
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=tomcat1,tomcat2

worker.status.type=status

Fijate que has de cambiar el puerto y la IP de cada Worker en cada NODO Tomcat, ajustalo a la configuración IP segun tu caso.

Ahora editamos el archivo /etc/apache2/mods-enabled/jk.conf en el que comentamos la linea que comienza con el parámetro JkWorkersFile y añadimos una nueva con la dirección de nuestro nuevo archivo worker.properties creado anteriormente, tendría que quedarte así:

También es necesario que modifiques los parámetros Location que se encuentran mas abajo con la siguiente configuración:


<Location /jk-status>
# Inside Location we can omit the URL in JkMount
JkMount jk-status
Order allow,deny
#Deny from all
Allow from all
</Location>
<Location /jk-manager>
# Inside Location we can omit the URL in JkMount
JkMount jk-manager
Order allow,deny
#Deny from all
Allow from all
</Location>

Ha de quedar como sigue!

 

2. – Instalacion y configuracion de NODOS Tomcat 8

La siguiente configuración es la misma para ambos servidores NODO, solo los valores en ROJO han de ser ajustados segun el servidor que toque.

Lo primero es instalar Tomcat 8 y unos extras:


apt-get update && apt-get -y upgrade
apt-get install -y tomcat8 tomcat8-admin tomcat8-docs tomcat8-examples

Una ves finalizada la instalación tienes que añadir el usuario de administración, el código es el siguiente y ha de ir dentro de las etiquetas principales, solo has de asignar el usuario y la contraseña que desees.

<role rolename=”manager-gui”/>
<user username=”tomcat” password=”secret” roles=”manager-gui”/>

Ahora simplemente reiniciamos Tomcat 8 en los dos NODOS:


/etc/init.d/tomcat8 restart

Despues puedes comprar el estado de los mismos con:


/etc/init.d/tomcat8 status

Luego de esto puedes acceder a cada servidor desde su IP añadiendo el puerto por defecto 8080 (http://192.168.1.31:8080 y http://192.168.1.32:8080)

Si todo esta correcto verías un mensaje por defecto de Tomcat 8.

Ahora es necesario modificar el archivo /etc/tomcat8/server.xml, busca la linea <connector port=”8009” protocol=”AJP/1.3” redirectport=”8443” /> que se encuentra comentada, simplemente tendrás que descomentar eliminado las etiquetas <!– del principio y –> del final, en el NODO Tomcat 1 no hay problema en dejar el port 8009 como puerto por defecto pero en el NODO Tomcat 2 es necesario que lo cambies por otro, por ejemplo 9009.

A continuación hemos de crear un archivo index.jsp para realizar la prueba del balanceador, en este caso crearemos el directorio demo con el siguiente comando en ambos servidores Tomcat:


mkdir /var/lib/tomcat8/webapps/demo

Ahora crearemos dentro de dicho directorio el archivo index.jsp (mkdir /var/lib/tomcat8/webapps/demo/index.jsp) con el siguiente contenido:

<!DOCTYPE html>
<html>
<head>
<title>Hello Tomcat</title>
</head>
<body>
<h1>Welcome to Tomcat Server 1</h1>
<h3>Hello World!</h3>
</body>
</html>

Ten en cuenta cambiar el numero en rojo por 2 para el caso del index.jsp del NODO Tomcat 8 192.168.1.32.

Finalmente reiniciamos los servicios en los 3 servidores:

Apache (192.168.1.30)


/etc/init.d/apache2 restart

Tomcat 1(192.168.1.31)


/etc/init.d/tomcat8 restart

Tomcat 2 (192.168.1.32)


/etc/init.d/tomcat8 restart

Ahora accediendo a la IP del Apache Proxy http://192.168.1.30/demo podremos ver el mensaje Welcome to Tomcat 1 o Welcome to Tomcat 2 variando cada ves que actualicemos la Web ya que el Apache Proxy ira repartiendo o balanceando la carga de solicitudes HTTP que se realizan al servidor entre ambos NODOS Tomcat 8.

Accediendo a http://192.168.1.30/status podrás ver el estado actual de NODOS Tomcat que se encuentran operativos, estadísticas entre otra información valiosa así como realizar algunos cambios en los parámetros de configuración!

Eso es todo! espero que os sirva de ayuda, hasta la próxima!

Cluster Apache Proxy Balancer

Que es un proxy?

Según la Wikipeda “en una red informática, es un servidor, programa o dispositivo, que hace de intermediario en las peticiones de recursos que realiza un cliente (A) a otro servidor (C)”, es decir, es un método usado para controlar en cierta forma el trafico.

En este caso quiero referirme específicamente a Apache Proxy, digamos que tenemos una pequeña Web corporativa donde mostramos simplemente la información de los servicios de nuestra empresa, un pequeño formulario de contacto y algunas imágenes, es evidente que una Web de este tipo no recibirá muchas visitas al día, digamos que como mucho concurrente-mente tendrá un aproximado de entre 10 y 50 visitas al día, ahora pensemos en el trafico que puede llegar a recibir Facebook!, la expresión correcta seria MADRE MIA! no?, pues si, no se la cifra exacta de la cantidad de visitas que recibe Facebook, pero os aseguro que la Web de Facebook no se almacena en un simple paquete de Hosting Reseller, ni en un VPS, ni siquiera en un server dedicado sino en granjas de servidores para garantizar así que la cantidad de visitas simultaneas que recibe esa Web no haga que los servidores caigan y consigan así ese trending topic en Twitter con el hashtag #facebook-down o algo similar.

Hoy quiero plasmar como poner en marcha de forma muy sencilla un cluster con balanceo de carga con un servidor Apache 2.4.10 basado en Debian Jessie 8.7 como HTTP Proxy y 2 servidores Backend basados en Debian Jessie 8.7 tambien, aunque como refiero en la imagen de arriba puede tratarse de servidores que se encuentren en el backend basados en distintos OS o incluso distintos tipos de versiones de Web Server como NGINX, IIS, Apache, etc.

IMPORTANTE:

Obviar en todos los comandos el caracter especial #

Que necesitamos:

  1. Una instalación limpia de 3 servidores (pueden ser maquinas virtuales tranquilamente no os agobies) con Debian Jessie 8.7 (No explicare como instalar Debian en esta ocasión, quizás mas adelante y luego añado acá el link a dicho post) .
  2. Un ordenador cliente con Kitty o en su defecto Putty, o la consola con la que estés habituado a trabajar.
  3. Obviamente conexión a Internet 😉
  4. Ganas de teclear un rato!

A ensuciarnos las manos

Los siguientes pasos son a ejecutar en los tres servidores:

Hacemos un update de las fuentes de APT:

# apt-get update

Instalamos Apache, actualmente al instalarlo desde APT instalara la version 2.4.10, pero probablemente si se hace en un momento en el que el release sea otra versión sera la que instale.

# apt-get install apache2 apache2-doc

Cada servidor ha de tener su respectiva IP con lo cual yo en particular asignare las siguientes:

  • 192.168.1.30 (Servidor Apache Proxy)
  • 192.168.1.31 (Servidor Apache Cluster 1)
  • 192.168.1.32 (Servidor Apache Cluster 2)

Teniendo instalado Apache 2.4.10 en cada servidor modificamos el contenido del index en los dos servidores Backend (Cluster1 y Cluster2) con el siguiente comando (como root):

En el Servidor Apache Proxy:

# cp /var/www/html/index.html /var/www/html/index_.html && echo "PROXY" > /var/www/html/index.html

En el Servidor Apache Cluster 1:

# cp /var/www/html/index.html /var/www/html/index_.html && echo "CLUSTER 1" > /var/www/html/index.html

En el Servidor Apache Cluster 2:

# cp /var/www/html/index.html /var/www/html/index_.html && echo "CLUSTER 2" > /var/www/html/index.html

Ahora si accedemos a cada una de sus IP´s a traves de un navegador veremos que cada una nos muestra PROXY o CLUSTER 1 o CLUSTER 2.

Ahora vamos al servidor Proxy y desde la consola necesitamos activar o habilitar los módulos necesarios para que Apache Proxy funcione correctamente con lo que ejecutamos los siguientes comandos uno a uno, con la ejecución de cada uno de estos comandos veremos de vuelta el aviso de que se debe reiniciar Apache para que entre en funcionamiento cada modulo, no obstante los ejecutamos todos y finalmente haremos el reinicio de Apache.:

# a2enmod proxy
# a2enmod proxy_http
# a2enmod proxy_balancer
# a2enmod lbmethod_byrequests

Ahora reiniciamos Apache 2 con el siguiente comando:

# service apache2 restart

Ahora en principio ya tenemos lo necesario para realizar la configuración del Proxy, así que vamos a  ello.

En el servidor Proxy con IP 192.168.1.30 hacemos un backup del archivo inicial por si acaso y editamos el archivo

/etc/apache/sites-available/000-default.conf quedando con el siguiente de la siguiente manera:


<VirtualHost *:80>

<Proxy balancer://mycluster>
BalancerMember http://192.168.1.31:80
BalancerMember http://192.168.1.32:80
</Proxy>

ProxyPreserveHost On

ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/

</VirtualHost>

En este caso se trata del archivo de configuración de Apache por defecto, lo que se refiere a cualquier solicitud de cualquier dominio que responda al puerto 80 (HTTP), en la sección de Proxy indicamos que se trata de un balancer llamado mycluster, dentro de las etiquetas incluimos a los dos miembros con la directiva BalancerMember indicando su respectiva ruta y puertos correspondientes, el parametro ProxyPreserveHost permite que el salto del servidor FronEnd (Proxy) al servidor BackEnd Cluster 1 o 2 sea transparente para el visitante de la Web, y las directivas ProxyPass y ProxyPassReverse gestionan el salto y la vuelta del servidor de FrontEnd a BackEnd.

Luego de estas modificaciones solo nos resta reiniciar Apache en el servidor Proxy:

# service apache2 restart

Ahora al tratarse de la configuración por defecto del servidor Proxy a nivel de Apache si intentamos acceder a su dirección IP a través del navegador con http://192.168.1.30 veremos que lo que nos muestra es CLUSTER 1, y si refrescamos o actualizamos la Web el contenido cambiara a CLUSTER 2, cada ves que refresquemos comenzara a pasarnos a mostrar el contenido de lo que hay en /var/www/html/* de cada uno de los servidores que estén añadidos al Cluster-Balancer, no obstante como usuarios siempre pensaremos que estamos accediendo al contenido en el Servidor Proxy.

Lo importante de todo esto es la escalabilidad y estabilidad, esto tomando en cuenta que en el caso de que la cantidad de visitas comience a llegar a tal punto en el que los servidores comiencen a caer podemos ir escalando el servicio para conseguir asi repartir de mejor manera el trafico o las peticiones HTTP de los usuarios, mientras mas visitas, añadimos mas servidores al cluster.

Ahora lo siguiente tiene que ser un cluster de MySQL, y dado que esto lo he montado todo en VMWare lo otro sera llevarlo a containers de Docker y comprobar diferencias de rendimiento!

Manten el statu-quo!

Adicional!

Hay algo adicional e interesante que es usado para manejar o gestionar lo relacionado con el balanceo que viene implícito en el Apache, el Balancer-Manager, para activarlo solo has de añadir una configuración adicional a la configuración del VHost, en este caso el archivo quedaría así:


<VirtualHost *:80>
BalancerMember http://192.168.1.31:80
BalancerMember http://192.168.1.32:80

ProxyPreserveHost On
SetHandler balancer-manager
Order allow,deny
allow from 192.168.1

ProxyPass /balancer-manager !
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/

</VirtualHost>

Ahora reiniciamos el servicio de Apache como siempre:

# service apache2 restart

De esta forma accediendo desde la IP del Proxy y añadiendo balancer-manager como ruta podemos acceder al panel de configuración del Balancer del Proxy donde verían algo como lo que muestro en la imagen a continuación donde tendrás la opción de hacer cambios a nivel del Balancer y aplicarlos en caliente sin necesidad de reiniciar el servicio de Apache!