HAProxy com passagem SSL para vários domínios com várias infra-estruturas
No momento todos os nossos pedidos são agrupados (2 nó appservers, e 1 apache em cada nó bem) e não temos um LB então, nós apenas apontar o alias de DNS para o primeiro servidor de web de cada nó, fazendo com que o segundo nó inútil (tem que manualmente fazer mudar de DNS no caso de uma falha do nó1, e nós não temos o balanceamento de carga https consultas).
cada aplicação usa SSL com um domínio específico Certificado & SSL. não podemos aceitar descodificar o SSL e enviar tráfego não cifrado para as infra-estruturas, uma vez que o LB pode estar localizado noutro país, etc. temos de usar o passe.
Antes de tudo, só queria saber se isto é realmente possível em HAProxy ou não ? Estou a falar de 50 aplicações diferentes. Nossa configuração LB teria que ser HA, então acho que vamos usar algo como keepalived com um VIP compartilhado para o próprio HAProxy.a armadilha seria parece-se com isto, suponho.
domain-a.com-' '-> backend_dom_a -> 1.1.1.1 (app node1 dom a)
| | 1.1.1.2 (app node2 dom a)
domain-b.com-' '-> backend_dom_b -> 2.1.1.1 (app node1 dom b)
| | 2.1.1.2 (app node2 dom b)
domain-c.com-' '-> backend_dom_c -> 3.1.1.1 (app node1 dom c)
| | 3.1.1.2 (app node2 dom c)
domain-N.com-' '-> backend_dom_N -> 4.1.1.1 (app node1 dom N)
| | 4.1.1.2 (app node2 dom N)
+-> haproxy -+
Obrigado pelo vosso apoio, melhores cumprimentos.
3 answers
Acho que tens duas opções:
Passe o tráfego para a infra-estrutura usando o modo TCP na interface e infra-estrutura haproxy. Isto tem o benefício pelo qual o seu certificado SSL da infra-estrutura é passado. Embora você perca a possibilidade de ter uma rescisão SSL em seu site. Então apresento-te
Ter um certificado SSL (normal), agindo como terminação para o seu site e ativar SSL entre a sua infra-estrutura e instância haproxy. Isto dá-lhe o vantagem de que você ainda tem apenas um ponto de entrada, mas diferentes infra-estruturas com certificados únicos.
A segunda opção pode ser assim:
frontend f_foo
bind :443 ssl crt /path/to/bundle
mode http
log global
use_backend b2_foo
backend be_foo
mode http
timeout connect 5s
server FOO address:port ssl check crt /path/to/client/bundle force-tlsv10 verify none
A desvantagem é que você precisa de um certificado de cliente para cada servidor de infra-estrutura, mas que deve ser facilmente automatizável.
Como mais uma resposta de atualização para configurações de vários domínios, eu uso o abaixo para roteamento de diferentes domínios. na interface é onde você liga a porta e adiciona as certs que múltiplas têm que estar na mesma linha afaik.
frontend https_in
bind *:443 ssl crt /link/to/cert+key-file.pem crt /link/to/cert+key-file.pem
A máquina acl é onde você indica o nome do domínio e a infra-estrutura a usar com base nesse nome de domínio.
acl host_example.com hdr(host) -i example.com
use_backend BACKEND_NAME if host_example.com
A infra-estrutura onde indica o servidor em que o domínio está a correr.
backend BACKEND_NAME
mode http
option httpclose
option forwardfor
cookie JSESSIONID prefix
server server-name server-ip:443 check ssl verify none
Para tua informação, estou a usar esta configuração que funciona como um encanto.
Eu substituí os valores nos ficheiros para esconder os nossos domínios e nomes das máquinas, e limitei os números de urls/infra-estruturas, mas temos cerca de 50 a correr agora com a balancer de carga a encaminhar os pedidos para muitos servidores apache (e cada apache encaminha os pedidos para os servidores tomcat por trás)
Sinta-se à vontade se tiver alguma pergunta
Usamos a fonte de equilíbrio para garantir a estabilidade da sessão
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
daemon
user haproxy
group haproxy
log /dev/log local6 notice
log /dev/log local5 info
maxconn 50000
#chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode tcp
option tcplog
log global
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
#---------------------------------------------------------------------
# dedicated stats page
#---------------------------------------------------------------------
listen stats
mode http
bind :22222
stats enable
stats uri /haproxy?stats
stats realm Haproxy\ Statistics
stats auth <mylogin>:<mypass>
stats refresh 30s
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main_https_listen
bind <ip address>:443
mode tcp
option tcplog
log global
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
#---------------------------------------------------------------------
# Common HAProxy nodes configuration
#---------------------------------------------------------------------
# -------------------------------
# ACLs
# -------------------------------
acl acl_SIT_AT35073 req.ssl_sni -i <app_url1>.my.domain.net # SIT_AT35073 is just an internal code we use, but you can use any alias
acl acl_SIT_AT34305 req.ssl_sni -i <app_url2>.my.domain.net
acl acl_SIT_AT28548 req.ssl_sni -i <app_urlN>.my.domain.net
# -------------------------------
# Conditions
# -------------------------------
use_backend backend_SIT_AT35073 if acl_SIT_AT35073 # same here
use_backend backend_SIT_AT34305 if acl_SIT_AT34305
use_backend backend_SIT_AT28548 if acl_SIT_AT28548
#---------------------------------------------------------------------
# Backends
#---------------------------------------------------------------------
# APP 1
backend backend_SIT_AT35073
description APPNAME1
mode tcp
balance source
option ssl-hello-chk
server server_SIT_AT35073_1 <apache_server1>.my.domain.net:443 check
server server_SIT_AT35073_2 <apache_server2>.my.domain.net:443 check
# APP 2
backend backend_SIT_AT34305
description APPNAME2
mode tcp
balance source
option ssl-hello-chk
server server_SIT_AT34305_1 <apache_server3>.my.domain.net:443 check
server server_SIT_AT34305_2 <apache_server4>.my.domain.net:443 check
# APP N
backend backend_SIT_AT28548
description APPNAMEN
mode tcp
balance source
option ssl-hello-chk
server server_SIT_AT28548_1 <apache_server5>.my.domain.net:443 check
server server_SIT_AT28548_2 <apache_server6>.my.domain.net:443 check