Cómo configurar NGINX altamente disponible con KeepAlived en CentOS 8

Nginx es un servidor web gratuito, de código abierto y uno de los más populares del mundo. También puede utilizarse como proxy inverso, equilibrador de carga y caché HTTP. La alta disponibilidad permite a una aplicación redirigir el trabajo a otro sistema en caso de fallo. Hay diferentes tecnologías disponibles para configurar un sistema de alta disponibilidad.

Keepalived es un demonio del sistema que supervisa continuamente los servicios o sistemas y consigue una alta disponibilidad en caso de fallo. Si un nodo se cae, el segundo nodo sirve los recursos.

En este tutorial, te mostraré cómo configurar un servidor web Nginx de alta disponibilidad con KeepAlived en CentOS 8.

Requisitos previos

  • Dos servidores con CentOS 8, uno para el nodo maestro y otro para el nodo de reserva.
  • Una contraseña de root configurada en tu servidor.

Instalar Nginx en ambos nodos

En primer lugar, tendrás que instalar el paquete Nginx en ambos nodos. Puedes instalarlo con el siguiente comando:

dnf install nginx -y

Una vez instalado el Nginx en ambos nodos, inicia el servicio Nginx y habilítalo para que se inicie al reiniciar el sistema:

systemctl start nginx
systemctl enable nginx

Una vez que hayas terminado, puedes pasar al siguiente paso.

Crear el archivo Index.html en ambos nodos

A continuación, tendrás que crear un archivo index.html personalizado en ambos nodos para identificar cada nodo.

En el primer nodo, crea un archivo index.html con el siguiente comando:

echo "<h1>This is My First NGINX Web Server Node</h1>" | tee /usr/share/nginx/html/index.html

En el segundo nodo, crea un archivo index.html con el siguiente comando:

echo "<h1>This is My Second NGINX Web Server Node</h1>" | tee /usr/share/nginx/html/index.html

Guarda y cierra el archivo cuando hayas terminado.

Instalar y configurar Keepalived

A continuación, tendrás que instalar Keepalived en ambos nodos. Por defecto, el paquete Keepalived está disponible en el repositorio por defecto de CentOS 8. Puedes instalarlo ejecutando el siguiente comando:

dnf install keepalived -y

Una vez instalado el paquete keepalived en ambos nodos, tendrás que editar el archivo de configuración por defecto de keepalived en ambos nodos.

En el primer nodo, edita el archivo keepalived.conf:

nano /etc/keepalived/keepalived.conf

Elimina el contenido por defecto y añade el siguiente contenido:

global_defs {
  # Keepalived process identifier
  router_id nginx
}

# Script to check whether Nginx is running or not
vrrp_script check_nginx {
  script "/bin/check_nginx.sh"
  interval 2
  weight 50
}

# Virtual interface - The priority specifies the order in which the assigned interface to take over in a failover
vrrp_instance VI_01 {
  state MASTER
  interface eth0
  virtual_router_id 151
  priority 110

  # The virtual ip address shared between the two NGINX Web Server which will float
  virtual_ipaddress {
    192.168.1.10/24
  }
  track_script {
    check_nginx
  }
  authentication {
    auth_type AH
    auth_pass secret
  }
}

Guarda y cierra el archivo cuando hayas terminado.

En el segundo nodo, edita el archivo keepalived.conf:

nano /etc/keepalived/keepalived.conf

Elimina el contenido por defecto y añade el siguiente contenido:

global_defs {
  # Keepalived process identifier
  router_id nginx
}

# Script to check whether Nginx is running or not
vrrp_script check_nginx {
  script "/bin/check_nginx.sh"
  interval 2
  weight 50
}

# Virtual interface - The priority specifies the order in which the assigned interface to take over in a failover
vrrp_instance VI_01 {
  state BACKUP
  interface eth0
  virtual_router_id 151
  priority 100

  # The virtual ip address shared between the two NGINX Web Server which will float
  virtual_ipaddress {
    192.168.1.10/24
  }
  track_script {
    check_nginx
  }
  authentication {
    auth_type AH
    auth_pass secret
  }
}

Guarda y cierra el archivo. A continuación, tendrás que crear un script para comprobar si el servicio Nginx se está ejecutando o no. Puedes crearlo con el siguiente comando:

Nota: Acaba de sustituir MASTER por BACKUP y 110 por 100 en el archivo de configuración anterior.

nano /bin/check_nginx.sh

Añade las siguientes líneas:

#!/bin/sh
if [ -z "`pidof nginx`" ]; then
  exit 1
fi

Guarda y cierra el archivo y luego establece los permisos adecuados con el siguiente comando:

chmod 755 /bin/check_nginx.sh

Por último, inicia el servicio keepalived y permite que se inicie al reiniciar el sistema con el siguiente comando:

systemctl start keepalived
systemctl enable keepalived

También puedes comprobar el estado del servicio keepalived utilizando el siguiente comando:

systemctl status keepalived

Deberías obtener la siguiente salida:

? keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2021-04-08 04:24:22 EDT; 5s ago
  Process: 3141 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 3142 (keepalived)
    Tasks: 2 (limit: 12524)
   Memory: 2.1M
   CGroup: /system.slice/keepalived.service
           ??3142 /usr/sbin/keepalived -D
           ??3143 /usr/sbin/keepalived -D

Apr 08 04:24:22 node1 Keepalived_vrrp[3143]: (VI_01) Changing effective priority from 110 to 160
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: (VI_01) Receive advertisement timeout
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: (VI_01) Entering MASTER STATE
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: (VI_01) setting VIPs.
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: Sending gratuitous ARP on eth0 for 192.168.1.10
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: (VI_01) Sending/queueing gratuitous ARPs on eth0 for 192.168.1.10
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: Sending gratuitous ARP on eth0 for 192.168.1.10
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: Sending gratuitous ARP on eth0 for 192.168.1.10
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: Sending gratuitous ARP on eth0 for 192.168.1.10
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: Sending gratuitous ARP on eth0 for 192.168.1.10

También puedes verificar el estado de la dirección IP virtual en el nodo maestro utilizando el siguiente comando:

ip add show

Deberías ver la dirección IP virtual 192.168.1.10 en la siguiente salida:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:00:2d:3a:20:9b brd ff:ff:ff:ff:ff:ff
    inet 45.58.32.155/24 brd 45.58.32.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.1.10/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::200:2dff:fe3a:209b/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:00:0a:3a:20:9b brd ff:ff:ff:ff:ff:ff
    inet6 fe80::200:aff:fe3a:209b/64 scope link 
       valid_lft forever preferred_lft forever

Una vez que hayas terminado, puedes pasar al siguiente paso.

Configurar el cortafuegos en ambos nodos

A continuación, tendrás que permitir el puerto 80 y permitir el VRRP en ambos nodos. Puedes hacerlo con el siguiente comando:

firewall-cmd --permanent --add-service=http
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent

A continuación, recarga el firewalld para aplicar los cambios:

firewall-cmd –reload

Verificar Keepalived

En este punto, Nginx y Keepalived están instalados y configurados. Es hora de probar si la alta disponibilidad de Nginx funciona o no.

Abre tu navegador web y accede a la URL http://your-virtual-ip. Deberías ver la siguiente página:

Página de Nginx en el nodo 1

Ahora, detén el servicio Nginx en el nodo Maestro y comprueba si la IP virtual pasa del Nodo 1 al Nodo 2.

En el nodo Maestro, detén el servicio Nginx con el siguiente comando:

systemctl stop nginx

A continuación, inicia sesión en el Nodo2 y verifica la IP virtual utilizando el siguiente comando:

ip add show

Deberías ver tu IP virtual en la siguiente salida:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:00:2d:3a:26:37 brd ff:ff:ff:ff:ff:ff
    inet 45.58.38.55/24 brd 45.58.38.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.1.10/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::200:2dff:fe3a:2637/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:00:0a:3a:26:37 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::200:aff:fe3a:2637/64 scope link 
       valid_lft forever preferred_lft forever

Ahora, accede a tu servidor web Nginx utilizando la URL http://your-virtual-ip. Deberías ver la página de Node2:

Nginx en el nodo 2

Conclusión

Enhorabuena! has configurado con éxito un servidor Nginx de alta disponibilidad con Keepalived. Espero que ahora tengas suficientes conocimientos para configurar un servidor Nginx de alta disponibilidad en un entorno de producción.

También te podría gustar...