Implementación de Alta Disponibilidad con Keepalived, Nginx y Tomcat en CentOS 7

Arquitectura del Sistema

Para este despliegue utilizaremos una infraestructura compuesta por tres nodos principales, garantizando balanceo de carga y redundancia:

  • Nodo Balanceador (Nginx + Keepalived): 192.168.2.224 (IP Virtual: 192.168.2.226)
  • Nodo de Aplicación 1 (Tomcat): 192.168.2.222
  • Nodo de Aplicación 2 (Tomcat): 192.168.2.223

1. Instalación y Configuración de Nginx

Primero, preparamos el entorno instalando las dependencias necesarias y compialndo Nginx desde el código fuente para asegurar el soporte de módulos específicos.

# Creación de usuario de sistema para el servicio
groupadd -r webserver && useradd -r -g webserver -s /bin/false -M webserver

# Instalación de dependencias de desarrollo
yum -y install openssl openssl-devel libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed gcc make

# Descarga y descompresión de Nginx
wget http://nginx.org/download/nginx-1.9.0.tar.gz
tar -zxf nginx-1.9.0.tar.gz
cd nginx-1.9.0

# Preparación de directorios temporales
mkdir -p /var/cache/nginx/{client,proxy,fastcgi,uwsgi,scgi}

# Configuración de compilación
./configure --prefix=/usr/local/nginx \
--user=webserver \
--group=webserver \
--with-http_ssl_module \
--with-http_gzip_static_module \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock

make && make install

Para gestionar el servicio, creamos un script de inicio en /etc/init.d/nginx:

#!/bin/bash
# chkconfig: 2345 85 15
# description: Nginx Service Script

CMD="/usr/sbin/nginx"
CONF="/etc/nginx/nginx.conf"
PID_PATH="/var/run/nginx.pid"

case "$1" in
    start)
        $CMD -c $CONF
        ;;
    stop)
        kill -QUIT `cat $PID_PATH`
        ;;
    restart)
        $0 stop
        sleep 1
        $0 start
        ;;
    reload)
        kill -HUP `cat $PID_PATH`
        ;;
    *)
        echo "Uso: $0 {start|stop|restart|reload}"
        exit 1
esac

2. Despliegue de Servidores de Aplicaciones Tomcat

En los nodos de aplicación, es necesario instalar Java JDK 1.8 y configurar las instancias de Tomcat.

# Instalación de JDK
rpm -ivh jdk-8u11-linux-x64.rpm

# Configuración de variables de entorno en /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_11
export CATALINA_HOME=/opt/tomcat/apache-tomcat-9.0.4
export PATH=$JAVA_HOME/bin:$PATH

source /etc/profile

Modificamos el puerto por defecto en conf/server.xml de Tomcat para que escuche en el puerto 80 si es necesario, y ajustamos la codificación:

<Connector port="80" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443" 
           URIEncoding="UTF-8" />

3. Configuración del Balanceo de Carga en Nginx

Editamos /etc/nginx/nginx.conf para definir el grupo de servidoers backend (upstream) y la lógica de redirección.

http {
    upstream app_cluster {
        # Algoritmo de balanceo por peso
        server 192.168.2.222:80 weight=2;
        server 192.168.2.223:80 weight=1;
    }

    server {
        listen 80;
        server_name localhost;

        location / {
            proxy_pass http://app_cluster;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

Nginx soporta otros métodos de distribución como ip_hash (persistencia de sesión) o fair (basado en tiempo de respuesta).

4. Configuración de Alta Disponibilidad con Keepalived

Instalamos Keepalived en los nodos balanceadores para gestionar una IP Virtual (VIP) que saltará entre servidores en caso de fallo.

yum install -y keepalived

Ejemplo de configuración para el nodo MASTER en /etc/keepalived/keepalived.conf:

vrrp_script check_web {
    script "/etc/keepalived/monitor_nginx.sh"
    interval 3
    weight -20
}

vrrp_instance ETHERNET_1 {
    state MASTER
    interface eth0
    virtual_router_id 60
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass secret123
    }
    virtual_ipaddress {
        192.168.2.226
    }
    track_script {
        check_web
    }
}

El nodo BACKUP debe tener una configuración similar, pero con state BACKUP y una priority menor (ej. 90).

Script de monitoreo /etc/keepalived/monitor_nginx.sh:

#!/bin/bash
# Comprobar si Nginx está corriendo
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
    systemctl start nginx
    sleep 2
    if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
        systemctl stop keepalived
    fi
fi

Finalmente, habilitamos los servicios para que inicien con el sistema:

systemctl enable keepalived
systemctl start keepalived

Etiquetas: Nginx Keepalived tomcat centos7 load-balancing

Publicado el 11-2 14:27