Como sabemos, NGINX es un servidor web altamente calificado que también se puede usar como proxy inverso, equilibrador de carga y caché HTTP. En este artículo, demostraremos cómo configurar un servidor web NGINX de alta disponibilidad (HA) con keepalived en Linux. Keepalived funciona en VRRP (Protocolo de redundancia de enrutador virtual) que permite que una IP estática se conmute entre dos sistemas Linux.
Los siguientes son mis detalles de laboratorio para NGINX HA:
- Nodo 1 – 192.168.1.130 – nginx1.example.com – mínimo CentOS 8 / RHEL 8
- Nodo 2 – 192.168.1.140 – nginx2.example.com – mínimo CentOS 8 / RHEL 8
- IP virtual (VIP) – 192.168.1.150
- sudo usuario pkumar
- Cortafuegos habilitado
- SELinux en ejecución
Pasemos a los pasos de instalación y configuración,
Paso 1) Instale el servidor web NGINX desde la línea de comandos
El paquete NGINX está disponible en los repositorios predeterminados de CentOS 8/RHEL 8, así que ejecute el comando dnf en ambos nodos para instalar el servidor web nginx
$ sudo dnf install -y nginx
Para CentOS 7/RHEL 7
El paquete NGINX no está disponible en los repositorios predeterminados de CentOS 7 / RHEL 7, por lo que para instalarlo primero debemos habilitar el repositorio epel. Ejecute el siguiente comando en ambos nodos
$ sudo yum install epel-release -y $ sudo yum install -y nginx
Para Ubuntu/Debian
Para las distribuciones de Linux basadas en Debian, el paquete del servidor web nginx está disponible en los repositorios de paquetes predeterminados, por lo que para instalar nginx, ejecute
$ sudo apt update $ sudo apt install -y nginx
Paso 2) Configure el archivo index.html personalizado para ambos nodos
Vamos a crear un archivo index.html personalizado para ambos nodos para que podamos identificar fácilmente qué servidor está sirviendo al sitio web al acceder a través de una IP virtual.
Para el nodo 1, ejecute el siguiente comando de eco,
[[email protected] ~]$ echo "<h1>This is NGINX Web Server from Node 1</h1>" | sudo tee /usr/share/nginx/html/index.html
Para el nodo 2, ejecute
[[email protected] ~]$ echo "<h1>This is NGINX Web Server from Node 2</h1>" | sudo tee /usr/share/nginx/html/index.html
Paso 3) Permita el puerto NGINX en el firewall e inicie su servicio
En caso de que el firewall esté habilitado y se esté ejecutando en ambos nodos, permita el puerto 80 ejecutando los siguientes comandos:
Para el sistema CentOS/RHEL
$ sudo firewall-cmd --permanent --add-service=http $ sudo firewall-cmd –reload
Para sistema Ubuntu/Debian
$ sudo ufw allow 'Nginx HTTP'
Inicie y habilite el servicio nginx ejecutando debajo de los comandos en ambos nodos,
$ sudo systemctl start nginx $ sudo systemctl enable nginx
Pruebe el servidor web NGINX de ambos nodos ejecutando el siguiente comando curl desde el exterior,
$ curl http://192.168.1.130 <h1>This is NGINX Web Server from Node 1</h1> $ curl http://192.168.1.140 <h1>This is NGINX Web Server from Node 2</h1>
Perfecto, la salida del comando anterior confirma que nginx se está ejecutando y es accesible desde el exterior con la dirección IP del sistema.
Paso 4) Instalar y configurar Keepalived
Para los sistemas CentOS / RHEL, el paquete keepalived y sus dependencias están disponibles en los repositorios de paquetes predeterminados, por lo que su instalación es sencilla, simplemente ejecute el comando debajo en ambos nodos.
$ sudo dnf install -y keepalived // CentOS 8/ RHEL 8 $ sudo yum install -y keepalived // CentOS 7 / RHEL 7
Para el sistema Ubuntu/Debian,
$ apt install -y keepalived
Una vez que el keepalived esté instalado, configúrelo editando su archivo de configuración ‘/etc/keepalived/keepalived.conf’. Mantendremos el nodo 1 como nodo maestro y el nodo 2 como nodo de respaldo.
Realice una copia de seguridad del archivo de configuración,
[[email protected] ~]$ sudo cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-org
Reemplace el contenido de keepalived.conf con lo siguiente:
[[email protected] ~]$ echo -n | sudo tee /etc/keepalived/keepalived.conf [[email protected] ~]$ sudo vi /etc/keepalived/keepalived.conf
Pegue los siguientes contenidos
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 enp0s3 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.150/24 } track_script { check_nginx } authentication { auth_type AH auth_pass secret } }
Ahora cree un script con los siguientes contenidos que verificará si el servicio nginx se está ejecutando o no. Keepalived siempre verificará la salida del script check_nginx.sh, si encuentra que el servicio nginx está detenido o no responde, moverá la dirección IP virtual en el nodo de respaldo.
[[email protected] ~]$ sudo vi /bin/check_nginx.sh #!/bin/sh if [ -z "`pidof nginx`" ]; then exit 1 fi
guarde y cierre el archivo y establezca el permiso requerido con el comando chmod,
[[email protected] ~]$ sudo chmod 755 /bin/check_nginx.sh
Ahora copie los archivos keepalived.conf y check_nginx.sh del nodo 1 al nodo 2 usando el siguiente comando scp.
[[email protected] ~]$ scp /etc/keepalived/keepalived.conf [email protected]:/etc/keepalived/ [[email protected] ~]$ scp /bin/check_nginx.sh [email protected]:/bin/
Una vez que se copian los archivos, inicie sesión en el Nodo 2 y realice un par de cambios en el archivo keepalived.conf. Cambie el estado de MASTER a BACKUP y reduzca la prioridad estableciéndolo en 100. Después de realizar los cambios, keepalived.conf en el Nodo 2 se vería como se muestra a continuación:
En caso de que se esté ejecutando el firewall del sistema operativo, permita VRRP ejecutando los siguientes comandos,
Nota – Ejecute estos comandos en ambos nodos
Para sistemas CentOS/RHEL
$ sudo firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent $ sudo firewall-cmd --reload
Para sistemas Ubuntu/Debian
Permita VRRP ejecutando lo siguiente, desde el nodo maestro (Nodo 1), ejecute
$ sudo ufw allow to 224.0.0.18 comment 'VRRP Broadcast' $ sudo ufw allow from 192.168.1.140 comment 'VRRP Router'
Desde el Nodo Backup / Slave (Nodo 2)
$ sudo ufw allow to 224.0.0.18 comment 'VRRP Broadcast' $ sudo ufw allow from 192.168.1.130 comment 'VRRP Router'
Ahora, finalmente, inicie el servicio keepalived ejecutando debajo de los comandos systemctl desde ambos nodos,
$ sudo systemctl start keepalived $ sudo systemctl enable keepalived
Verifique el servicio keepalived ejecutando a continuación:
$ sudo systemctl status keepalived
Perfecto, ahora verifique el estado VIP (dirección IP virtual) en el nodo maestro, en nuestro caso, VIP es 192.168.1.130
$ ip add show
El resultado anterior confirma que VIP está configurado en el nodo maestro en su interfaz enp0s3. Entonces, hagamos las pruebas de keepalived y nginx en el siguiente paso.
Paso 5) Pruebas Keepalived y NGINX
Para realizar la prueba, intente acceder al servidor web nginx con IP virtual (192.168.1.150), actualmente debería mostrarnos la página nginx del nodo 1.
Abra el navegador wen y escriba ‘http://192.168.1.150’ y presione enter,
Ahora intente detener el servicio NGINX en el nodo 1 y vea si la IP virtual se cambia del Nodo 1 al Nodo 2 y luego intente acceder a la página web nginx con VIP (192.168.1.150) y esta vez debería mostrarnos la página nginx del nodo 2 .
[[email protected] ~]$ sudo systemctl stop nginx [[email protected] ~]$ ip add show
Inicie sesión en el nodo 2 y ejecute el comando ip para verificar la dirección IP virtual,
[[email protected] ~]$ ip add show
Ahora, intentemos acceder a la página web usando una IP virtual,
Genial, lo anterior confirma que hemos configurado con éxito el servidor web NGINX de alta disponibilidad con keepalived. Eso es todo de este artículo, por favor comparta sus opiniones, comentarios y sugerencias.