236 lines
9.2 KiB
HTML
236 lines
9.2 KiB
HTML
<!-- 38 | haproxy | configuración web -->
|
||
|
||
|
||
<!-- 38 | haproxy | configuración web -->
|
||
|
||
<div id="accordion">
|
||
<div class="card">
|
||
<div class="card-header" id="headingTwo">
|
||
<h5 class="mb-0">
|
||
<button class="btn btn-link collapsed" data-toggle="collapse" data-target="#collapseTwo" aria-expanded="false"
|
||
aria-controls="collapseTwo">
|
||
Puntos a considerar antes de modificar el archivo de configuración de HAProxy
|
||
</button>
|
||
</h5>
|
||
</div>
|
||
<div id="collapseTwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordion">
|
||
<div class="card-body">
|
||
<ol>
|
||
<li>
|
||
<p>
|
||
<strong>Dominio de nuestra página web:</strong> Es el nombre que adquirimos a través de proveedores como
|
||
<i>GoDaddy</i>, <i>Google Domains</i>, <i>Hostinger</i>, entre otros. Este dominio será la dirección que
|
||
los usuarios utilizarán para acceder a nuestro sitio web.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<strong>La IP pública:</strong> En muchos casos, la IP pública es dinámica, lo que significa que puede
|
||
cambiar con frecuencia. Esto puede ser un problema, ya que necesitamos una IP estática para garantizar la
|
||
accesibilidad constante de nuestros servicios. Para solucionar esto, podemos utilizar servicios como <a
|
||
href="https://www.duckdns.org/" target="_blank">Duck DNS</a>, que monitorea y actualiza automáticamente
|
||
la IP dinámica. Este servicio es especialmente útil para servicios como VPN, hosting web o conexiones SSH
|
||
(aunque este último no es recomendable por razones de seguridad).
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<strong>Configuración del router del ISP:</strong> En el router proporcionado por tu proveedor de
|
||
servicios de Internet (ISP), deberás abrir el puerto 80 (para este ejemplo). La configuración varía según
|
||
el modelo del router, pero generalmente debes buscar la opción de "Port Forwarding" o "Reenvío de
|
||
puertos". Allí, deberás agregar una regla que incluya:
|
||
<ul>
|
||
<li>La IP estática del balanceador de carga.</li>
|
||
<li>El puerto WAN (80 en este caso).</li>
|
||
<li>El puerto LAN (también 80).</li>
|
||
<li>El protocolo TCP.</li>
|
||
</ul>
|
||
Este proceso deberás repetirlo si tienes más de un router en tu red.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<strong>IP's estáticas de los servidores en la red local:</strong> Tanto los servidores web como el
|
||
balanceador de carga deben tener direcciones IP estáticas en la red local. Esto asegura que los
|
||
dispositivos siempre estén accesibles y que la configuración de red sea consistente.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<strong>SSL:</strong> Adicional a los puntos anteriores, no es obligatorio pero por seguridad debes
|
||
considerar usar un servicio SSL ya sea que lo contrates con el proveedor del dominio o con <a
|
||
href="https://dash.cloudflare.com/" target="_blank">Cloudflare</a> que tiene una versión gratuita.
|
||
</p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<p>
|
||
Para este ejemplo consideraremos la siguiente información para la configuración:
|
||
</p>
|
||
<ul>
|
||
<li><strong>Dominio:</strong> ejemplo-dom.com</li>
|
||
<li><strong>IP pública:</strong> Dinámica, pero gestionada con Duck DNS (ejemplo: ejemplos.duckdns.org).</li>
|
||
<li><strong>Router del ISP:</strong> El puerto 80 está abierto y redirigido a la IP del balanceador de carga.</li>
|
||
<li><strong>Servidores web:</strong> Supongamos que tenemos 4 servidores web y cada uno es un espejo del otro, las
|
||
IP´s son 198.162.10.4, 198.162.10.5, 198.162.10.6 y 198.162.10.7</li>
|
||
</ul>
|
||
|
||
<p>
|
||
Una vez instalado HAProxy podemos revisar si el servicio está activo con el comando:
|
||
</p>
|
||
|
||
{% set i %}
|
||
systemctl status haproxy
|
||
{% endset %}
|
||
{% with codigo=i.strip(), isEditable="false" %}
|
||
{% include 'components/copy-code.html' %}
|
||
{% endwith %}
|
||
|
||
<p>
|
||
La salida del comando debe ser algo similar a este:
|
||
</p>
|
||
|
||
{% set i %}
|
||
● haproxy.service - HAProxy Load Balancer
|
||
Loaded: loaded (/lib/systemd/system/haproxy.service; enabled; preset: enabled)
|
||
Active: active (running) since Mon 2025-03-17 12:12:45 CST; 2 days ago
|
||
Docs: man:haproxy(1)
|
||
file:/usr/share/doc/haproxy/configuration.txt.gz
|
||
Main PID: 2643 (haproxy)
|
||
Tasks: 5 (limit: 8742)
|
||
CPU: 5min 30.311s
|
||
CGroup: /system.slice/haproxy.service
|
||
├─2643 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /run/haproxy-master.sock
|
||
└─2645 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /run/haproxy-master.sock
|
||
{% endset %}
|
||
{% with btn=false, codigo=i.strip(), isEditable="false" %}
|
||
{% include 'components/copy-code.html' %}
|
||
{% endwith %}
|
||
|
||
<p>
|
||
Como podemos ver, HAProxy está activo, entonces podemos proceder a modificar el archivo de configuración con el editor
|
||
de nano y permisos de superusuario:
|
||
</p>
|
||
|
||
{% set ii %}
|
||
sudo nano /etc/haproxy/haproxy.cfg
|
||
{% endset %}
|
||
{% with codigo=ii.strip(), isEditable="false" %}
|
||
{% include 'components/copy-code.html' %}
|
||
{% endwith %}
|
||
|
||
<p>
|
||
Nos vamos hasta el final del archivo de configuración y añadimos la configuración del "frontend":
|
||
</p>
|
||
|
||
{% set iii %}
|
||
# frontend nombre_que_quieras
|
||
frontend https_frontend
|
||
# puerto que manejará el 80
|
||
bind *:80
|
||
# protocolo a usar
|
||
mode http
|
||
|
||
# nombre de nuestro dominio: ejemplo-dom.com
|
||
# validador ejemplo-dom.com = is_ejemplo_dom_com (colocar el prefijo "is_", además los guiones medios y puntos se cambian a guiones bajos)
|
||
acl is_ejemplo_dom_com hdr(host) -i ejemplo-dom.com
|
||
# el nombre del backend puede ser el que tú quieras
|
||
use_backend ejemplo_dom_com if is_ejemplo_dom_com
|
||
{% endset %}
|
||
{% with codigo=iii.strip() %}
|
||
{% include 'components/copy-code.html' %}
|
||
{% endwith %}
|
||
|
||
<p>
|
||
Una vez configurado el frontend, continuamos en el mismo archivo y añadimos el "backend":
|
||
</p>
|
||
|
||
{% set iv %}
|
||
# backend nombre backend usado en la configuración del frontend
|
||
backend ejemplo_dom_com
|
||
# protocolo de balanceo de carga (puedes dejarlo o googlear otros protocolos)
|
||
balance roundrobin
|
||
# protocolo para sitios web
|
||
mode http
|
||
# enlistar las IPs de los servidores web o coloca la DNS de cada uno de los servidores en caso de usar un servidor DNS.
|
||
server server1 198.162.10.4:80 check
|
||
server server2 198.162.10.5:80 check
|
||
server server3 198.162.10.6:80 check
|
||
server server4 198.162.10.7:80 check
|
||
# server{1-4} puede ser el nombre que tú quieras, solo es una referencia para HAProxy
|
||
# 198.162.10.X:80 = indica que el servidor con esa IP tiene un servicio web activo en el puerto 80, en caso de no usar el 80 solo reemplaza ese valor
|
||
# check = valida que el servidor esté operando antes de redirigir el tráfico
|
||
{% endset %}
|
||
{% with codigo=iv.strip() %}
|
||
{% include 'components/copy-code.html' %}
|
||
{% endwith %}
|
||
|
||
<p>
|
||
Una vez configurado el frontend y el backend en el archivo de HAProxy, guardamos <b>CTRL + S</b>, cerramos <b>CTRL +
|
||
X</b>. Para validar que la sintaxis de la configuración sea correcta puedes usar el comando:
|
||
</p>
|
||
|
||
{% set v %}
|
||
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
|
||
{% endset %}
|
||
{% with codigo=v.strip(), isEditable="false" %}
|
||
{% include 'components/copy-code.html' %}
|
||
{% endwith %}
|
||
|
||
<p>
|
||
Si todo está bien en términos de sintaxis, la salida del comando debe ser: <b style="color: green">Configuration file
|
||
is valid</b> <br>
|
||
Procedemos a reiniciar el servicio de HAProxy con el comando:
|
||
</p>
|
||
|
||
{% set vi %}
|
||
sudo service haproxy restart
|
||
{% endset %}
|
||
{% with codigo=vi.strip(), isEditable="false" %}
|
||
{% include 'components/copy-code.html' %}
|
||
{% endwith %}
|
||
|
||
<p>
|
||
Listo, ahora podrás entrar a tu navegador web e ingresar el dominio <b>ejemplo-dom.com</b>. Tu proveedor de dominio
|
||
redirigirá a Duck DNS que tiene tu IP y mandará el tráfico a tu router ISP, este a su vez lo mandará a tu balanceador
|
||
de carga para finalmente redirigir el tráfico al servidor web
|
||
que esté con menos carga. <br>
|
||
De forma práctica y simple, te recomiendo que en cada servidor web, en el HTML del sitio, en la página de inicio
|
||
coloques un comentario con el número de servidor, y desde el lado del navegador web refresques la página y veas cómo
|
||
cambia el número del servidor. Esto con la finalidad de saber si el balanceo de carga está funcionando, ejemplo diagrama de flujo:
|
||
</p>
|
||
|
||
{% set vii %}
|
||
[Usuario]
|
||
|
|
||
v
|
||
[Dominio ejemplo-dom.com]
|
||
|
|
||
v
|
||
[DuckDNS (resuelve IP dinámica)]
|
||
|
|
||
v
|
||
[Router ISP (Port Forwarding 80 -> HAProxy)]
|
||
|
|
||
v
|
||
[HAProxy]
|
||
|
|
||
+--> [Backend ejemplo_dom_com]
|
||
|
|
||
+--> [Servidor 1]
|
||
|
|
||
+--> [Servidor 2]
|
||
|
|
||
+--> [Servidor 3]
|
||
|
|
||
+--> [Servidor 4]
|
||
{% endset %}
|
||
{% with btn=false, codigo=vii.strip(), isEditable="false" %}
|
||
{% include 'components/copy-code.html' %}
|
||
{% endwith %}
|
||
|
||
{% include 'components/src_collapse.html' %} |