como configurar o HAProxy como um proxy reverso?

2

Eu tenho vários servidores da web, hospedando vários domínios. Ocasionalmente, preciso mover um domínio de um servidor da web para outro. Em vez de precisar atualizar o DNS para o domínio apontar para o novo local do servidor, gostaria de definir todos os domínios para apontar para um proxy reverso (?) Que passará as solicitações da Web para os servidores corretos. Eu estou tentando usar haproxy para conseguir isso, sem muito sucesso.

como exemplo:

Existem dois servidores, web1.foo.com e web2.foo.com. web1 serve sites para abc.com e def.com. web2 serve sites para cba.com e fed.com.

existe também um servidor proxy, proxy.foo.com.

dns para abc.com, etc são apontados para proxy.foo.com, que é configurado para mapear domínios para servidores da seguinte forma:

abc.com - > web1.foo.com def.com - > web1.foo.com cba.com - > web2.foo.com fed.com - > web2.foo.com

o problema é que eu não consigo trabalhar com o haproxy ... ele está tentando balancear a carga em vez do proxy reverso ... se eu for para o abc.com, ele irá alternar entre web1 e web2.

Então, eu acho que estou pensando, isso é possível com haproxy, e se assim for, onde estou errado com a configuração? minha configuração é assim:

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
    user haproxy
    group haproxy
    daemon

    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private

    # Default ciphers to use on SSL-enabled listening sockets.
    # For more information, see ciphers(1SSL). This list is from:
    #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
    ssl-default-bind-options no-sslv3

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000
    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 localhost
    bind *:80
    bind *:443
    option tcplog
    mode tcp
    default_backend servers

backend servers
    mode tcp
    server abc.com web1.foo.com
    server def.com web1.foo.com
    server cba.com web2.foo.com
    server fed.com web2.foo.com
    
por radio_babylon 06.07.2016 / 01:38

1 resposta

2

Sim, a maneira como você tem as coisas configuradas basicamente fará o balanceamento de carga de todas as conexões de entrada entre os servidores de back-end.

O que você quer é basicamente uma definição de back-end para cada servidor web real. Eu acho que a essência do que você quer é múltiplas definições de backend, uma para cada servidor web real. Em seguida, na seção frontend, você deseja usar vários condicionais para usar o back-end associado para qualquer URL de front-end solicitado. Uma pseudo-configuração pode ser algo assim:

frontend localhost
    mode http
    use_backend web1 if { hdr(host) -i abc.com }
    use_backend web1 if { hdr(host) -i def.com }
    use_backend web2 if { hdr(host) -i cba.com }
    use_backend web2 if { hdr(host) -i fed.com }

backend web1
    server web1 web1.foo.com

backend web2
    server web2 web2.foo.com

Observe o mode http . Acredito que é necessário realmente fazer coisas como tomar decisões com base em cabeçalhos HTTP.

E quando é hora de mover quais URLs vão para o backend, é uma simples questão de atualizar o arquivo de configuração e fazer uma atualização para o haproxy.

    
por 06.07.2016 / 06:11