Haproxy, configuración sencilla de un balanceador de carga.

En esta entrada vamos a ver como configurar un balanceador de carga usando HAPROXY sobre un Rocky Linux 9.

A continuación dejo un video explicándolo y a continuación los comandos aplicados a cada uno de los servidores para su configuración.

Aquí os dejo el vídeo:

#######  HAPROXY  #####

## Cambiamos hostname de la máquina

hostnamectl set-hostname haproxy

##Configuramos red con nmtui ( en mi ejemplo los siguientes datos )
	IP:192.168.1.200/24
	Gateway:192.168.1.1
	Dns1: 8.8.8.8
	Dns2: 8.8.8.8	

## Añadimos "PermitRootLogin yes" en /etc/ssh/sshd_config

PermitRootLogin yes 

## reiniciamos sshd y NetworkManager

systemctl restart NetworkManager sshd

## Para hacer un mejor testeo de la comunicación instalamos las net-tools

dnf install net-tools

## instalamos haproxy, lo arrancamos y lo habilitamos para que arranque en el inicio.

dnf install haproxy
systemctl start haproxy
systemctl enable haproxy

##Comprobamos el estado del servicio

systemctl status haproxy

# Configuramos logs en haproxy, creamos /etc/rsyslog.d/haproxy.conf

vi /etc/rsyslog.d/haproxy.conf

#Añadimos el siguiente contenido

# Send HAProxy messages to a dedicated logfile
:programname, startswith, "haproxy" {
  /var/log/haproxy.log
  stop

##Reiniciamos rsyslog
systemctl restart rsyslog

## Creamos el fichero

touch /var/log/haproxy.log

# Configuraciones dentro del fichero /etc/haproxy/haproxy.cfg

## Habilitamos el frontend para estadísticas

frontend stats
    mode http
    bind *:8404
    stats enable
    stats uri /stats
    stats refresh 10s
    stats admin if LOCALHOST
    stats auth admin:password

## Configuramos el backend con los dos frontales.

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
    mode http
    balance     roundrobin
    server  frontal1 192.168.1.210:80 check
    server  frontal2 192.168.1.220:80 check

# reiniciamos haproxy

systemctl restart haproxy

## Añadimos en el /etc/hosts los frontales.

192.168.1.210 frontal1
192.168.1.220 frontal2

## Configuramos firewalld para permitir conexiones http y https, y habilitar el acceso a las estadísticas de haproxy

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --zone=public --add-port 8404/tcp --permanent

## Reiniciamos firewalld para aplicar reglas.

systemctl restart firewalld

# Comprobamos el acceso a la URL de las estadísticas.

http://192.168.1.200:8404/stats

######### Frontales 1 y 2  #######
## Frontal1
hostnamectl set-hostname frontal1
## nmtui y configuramos nuestra red
	IP:192.168.1.210/24
	Gateway:192.168.1.1
	Dns1: 8.8.8.8
	Dns2: 8.8.8.8

## Frontal2	
hostnamectl set-hostname frontal2
## nmtui y configuramos nuestra red
	IP:192.168.1.220/24
	Gateway:192.168.1.1
	Dns1: 8.8.8.8
	Dns2: 8.8.8.8

## Añadimos en ambos frontales "PermitRootLogin yes" en /etc/ssh/sshd_config

PermitRootLogin yes 

## reiniciamos sshd y NetworkManager

systemctl restart NetworkManager sshd

## Comenzamos las instalaciones de apache y php-fpm ( lo mismo en ambos frontales )
	
dnf -y install httpd
systemctl start httpd
systemctl enable httpd
	
dnf install  php-fpm
systemctl start php-fpm
systemctl enable php-fpm

# Le decimos a selinux que acepte que apache-php conecte externamente ( MUY IMPORTANTE )

sudo setsebool -P httpd_can_network_connect 1 
						
## Habilitamos en el FW puertos 80 / 443 pero solo desde el HAPROXY generando una zona nueva.

firewall-cmd --new-zone=onlyhaproxy --permanent
firewall-cmd --zone=onlyhaproxy --add-source=192.168.1.200 --permanent
firewall-cmd --zone=onlyhaproxy --add-port=80/tcp  --permanent
firewall-cmd --zone=onlyhaproxy --add-port=443/tcp  --permanent
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
		
## Creamos el fichero index.php con este contenido en /var/www/html/

<?php

$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";
?>

<?php
// Datos de la conexión a la base de datos
$servername = "192.168.1.230";
$username = "prueba";
$password = "prueba";
$dbname = "test";
$port = 3306; // Especifica el puerto aquí

// Crear la conexión
$conn = new mysqli($servername, $username, $password, $dbname, $port);

// Verificar la conexión
if ($conn->connect_error) {
    die("Conexión fallida: " . $conn->connect_error);
}

echo "Conexión exitosa<br>";

// La consulta SQL
$sql = "SELECT * FROM shop";
$result = $conn->query($sql);

// Verificar si hay resultados y mostrarlos
if ($result->num_rows > 0) {
    // Mostrar los datos de cada fila
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["article"] . " - Nombre: " . $row["dealer"] . " - Apellido: " . $row["price"] . "<br>";
    }
} else {
    echo "0 resultados";
}

// Cerrar la conexión
$conn->close();
?>

######### MARIADB #######

## Cambiamos hostname

hostnamectl set-hostname mariadb

## nmtui y configuramos nuestra red
	IP:192.168.1.230/24
	Gateway:192.168.1.1
	Dns1: 8.8.8.8
	Dns2: 8.8.8.8

## Añadimos  "PermitRootLogin yes" en /etc/ssh/sshd_config

PermitRootLogin yes 

## reiniciamos sshd y NetworkManager

## Instalamos mariadb, lo arrancamos y habilitamos.

dnf install -y mariadb-server
systemctl start mariadb
systemctl enable mariadb
						
## Creamos la BBDD

mysql -e "create database test"

# Descargamos el ejemplo usado.
						
wget https://www.tecnicorioja.com/utilidades/mysql/test.sql

## Importamos 

mysql test < test.sql

## Configuramos el FW para solo aceptar conexiones a mysql desde la red de los frontales / haproxy.

firewall-cmd --new-zone=mysql --permanent
firewall-cmd --zone=mysql --add-source=192.168.1.0/24 --permanent
firewall-cmd --zone=mysql --add-service=mysql
firewall-cmd --runtime-to-permanent
firewall-cmd --reload

## Una vez realizado esto si cargamos desde un navegador http://192.168.1.200 veremos como accedemos al fichero que hace la consulta al mysql, si pulsamos repetidamente F5 veremos que va cambiando el frontal que sirve la web.
Espero os ayude, cualquier duda o sugerencia poneros en contacto conmigo. 

Categories:

, ,

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *