
Actualmente tengo un servidor web (10.0.0.77) que ejecuta nginx con múltiples vhosts (un par de sitios de wordpress e instalación de nextcloud), todos ejecutándose en 1 dirección IP y todo está protegido con un certificado comodín. Esto funciona bien, tanto interna como externamente.
Ahora quiero representar todo el tráfico externo a través de HAproxy. A continuación se muestra mi configuración de haproxy simplificada para un sitio de wordpres y nextcloud:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
maxconn 4096
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 15s
timeout client 15s
timeout server 15s
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend localhost80
bind *:80
mode http
redirect scheme https code 301 if !{ ssl_fc }
frontend localhost443
bind *:443
option tcplog
mode tcp
acl tls req.ssl_hello_type 1
tcp-request inspect-delay 5s
tcp-request content accept if tls
acl is_wordpress req.ssl_sni -i nextcloud.domain.com
acl is_nextcloud req.ssl_sni -i wordpress.domain.com
use_backend nextcloud_cluster if is_nextcloud
use_backend wordpress_cluster if is_wordpress
backend wordpress_cluster
mode tcp
option ssl-hello-chk
server is_wordpress 10.0.0.77:443 check
backend nextcloud_cluster
mode tcp
option ssl-hello-chk
server is_nextcloud 10.0.0.77:443 check
El problema es que tan pronto como redirijo el tráfico externo para que se ejecute a través de mi haproxy, si intento cargar, es decir. nextcloud.domain.com A veces obtengo wordpress.domain.com y viceversa.
¿Alguna idea de dónde me estoy equivocando?
Respuesta1
Al utilizar SNI para diferenciar entre servidores, debe tener en cuenta que en este caso específico los clientes que no son SNI no podrán acceder a los sitios.
Sin embargo, si esto está bien para sus clientes y aún mantiene el equilibrio en el mismo backend (como en el ejemplo), aún tendrá información redundante en su configuración. El enfoque más simple aquí sería:
frontend localhost443
bind *:443
option tcplog
mode tcp
default_backend backend1
backend backend1
mode tcp
option ssl-hello-chk
server server1 10.0.0.77:443 check
Dado que su configuración simplemente es un equilibrio de capa 4, si aún obtiene sitios web aleatorios, tendría que mirar un poco más de cerca el servidor web que se ejecuta en 10.0.0.77:443: ¿Qué servidor web, cómo está configurado, produce lo mismo? ¿Problema cuando se accede directamente?