Multiples dominios apuntados a distintos contenedores (Docker / LXC) con ayuda de HAProxy

HAProxy (High Availability Proxy) es un balanceador de carga que permite balancear el trafico entrante en tu host de cualquier servicio que se te ocurra y que funcione sobre el protocolo TCP. En este caso, usaremos HAProxy para enrutar múltiples y distintos dominios hacia cualquier contenedor que este ejecutando un servicio o aplicación en cualquier puerto de escucha usando el protocolo TCP.

El escenario es el siguiente, se cuenta con distintos contenedores, en el primer contenedor creado con LXC se encuentra ejecutando un servidor web escuchando en el puerto 80 y en otro contenedor creado con Docker se encuentra una aplicacion web con puerto de escucha en el 8080. Ya los virtualhost en el contenedor con el servidor web se encuentran configurados y cada contenedor cuenta con un IP privada asignada. Te recomiendo leer el articulo que he creado con el que podras generar multiples contenedores con LXC en un solo host y luego asignarles una IP privada usando DNSMasq + DHCP. 

Ahora bien, primero, instalamos el paquete de HAProxy en CentOS 7, por lo que ejecutamos:

$sudo yum install -y haproxy

Realizado lo anterior, editamos el archivo ubicado en /etc/haproxy/haproxy.cfg y agregamos lo siguiente: una sección frontend que contendrá el puerto 80 y con escucha en la IP publica del host que nos permitirá hacer forward de los requests entrantes y enviarlas a la sección backend. La sección backend es donde declaramos los distintos contenedores con las distintas IP privadas y puertos de escucha. Agregamos la sección frontend con lo siguiente:

 

frontend http-in  
    bind 0.0.0.0:80

    #Default container
    default_backend container_1com

    #Define Host:
    acl container1 hdr_end(host) -i domain1.com
    acl container2 hdr_end(host) -i domain2.net

    #Declare container backend:
    use_backend container1_com if container1
    use_backend container2_net if container2

En nuestra configuración nos ayudamos de las Access Control List, para hacer match de los dominios entrantes y luego enrutarlos a los distintos backend declarados. Agregamos la sección backend con lo siguiente:

 

backend container_1com
    mode http
    server container00 10.0.0.222:80 weight 5 check slowstart 5000ms

backend container_2net
    mode http
    server container00 10.0.0.223:8080 weight 5 check slowstart 5000ms

Ya con esto, al iniciar el servicio de HAProxy, y apuntada la IP publica en los DNS de los respectivos dominios, podremos encaminar los requests provenientes del dominio1.com por el puerto 80 hacia el contenedor con IP privada 10.0.0.222 con escucha en el puerto 80. Adicional, podremos agregar un redirect para el subdominio www hacia el dominio, tan solo en la sección frontend agregaremos lo siguiente:

#Redirect
redirect prefix http://domain1.com code 301 if { hdr(host) -i www.domain1.com }
redirect prefix http://domain2.net code 301 if { hdr(host) -i www.domain2.net }

Activar Logging en HAProxy

Para activar el registro de mensajes para HAProxy utilizaremos Rsyslog, que es una excelente herramienta utilizada para enviar registro de mensajes sobre IP Network, esto nos permitirá obtener los log de HAproxy y configurarlos a nuestro antojo.

Crearemos el archivo haproxy.conf en la ruta /etc/rsyslog.d/ con lo siguiente:

$Modload imudp
$UDPServerAddress 127.0.0.1
$UDPServerRun 514

#Level messages:
local0.=info /var/log/haproxy/haproxy_info.log
local0.notice /var/log/haproxy/haproxy_notice.log

local0.* ~

Deberemos tener creado el directorio  /var/log/haproxy/ por lo que si no sabes como , ejecutamos:

# mkdir -p /var/log/haproxy/

En el archivo de configuración para HAProxy es necesario tener lo siguiente:

log                     	127.0.0.1           local0 debug
log                     	127.0.0.1           local1 notice

Luego de esto reiniciamos los servicios para HAProxy y Rsyslog, deberíamos luego tener los dos archivos en la ruta /var/log/haproxy :

Cualquier duda que se te presente, escribeme en la caja de comentarios.