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.
Deja una respuesta