<!-- 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' %}