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:
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:
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.