back-ends dinâmicos com HAProxy

4

Estou tentando descobrir a melhor maneira de lidar com o proxy dinâmico de solicitações HTTP.

Basicamente eu quero pegar um nome de host dinâmico na forma de myname .cust.mydomain.com e, em seguida, encaminhar solicitações para um servidor de backend HTTP com o nome "myname" obtido do nome do host. / p>

Eu estive quebrando meu cérebro tentando descobrir a melhor maneira de lidar com isso e se o HAProxy estiver à altura da tarefa.

Outra opção que eu estava pensando era algo como Lighttpd com LUA ou até Nginx. Qualquer conselho seria muito apreciado. Obrigado!

    
por Jez 19.07.2011 / 07:52

1 resposta

9

A solução mais fácil seria usar o DNS para mapear foo.cust.mydomain.com para um IP de servidor específico, como sugerido pela womble. Isso ignoraria todo o servidor proxy. Talvez isso não seja possível para você, por exemplo, se você não tiver endereços IP públicos para os servidores de backend.

Direcionar todas as solicitações para um servidor (com um DNS curinga) e encaminhar as solicitações dinamicamente de acordo com o cabeçalho do Host é um pouco mais complicado, e parece que o HAProxy não pode fazer isso, porque cada servidor de back-end deve ser explicitamente definido em HAProxy configuração.

O Nginx, no entanto, é diferente, com a configuração correta O Nginx pode usar o cabeçalho do Host para escolher o backend. O Nginx precisa de um servidor DNS que mapeia nomes para endereços de backend, é claro.

Aqui está um pequeno exemplo da configuração:

server {
    listen 80 default;

    location / {
        # You might need to send some headers to the backend server
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;

        resolver 192.168.1.1; # DNS server IP
        # Forward all requests to the backend server using $http_host
        # (this is the 'Host:' header value)
        proxy_pass http://$http_host$request_uri;
    }
}

Isso redireciona http://myserver.cust.mydomain.com/foo/ para http://myserver.cust.mydomain.com/foo/ . Não parece muito útil à primeira vista. Mas se você configurar um servidor DNS privado que mapeie esses nomes para um endereço de servidor backend, a solicitação será encaminhada para um servidor backend correto em um endereço privado.

Mas esse tipo de configuração do servidor DNS pode não ser desejado e pode causar problemas em alguns casos. Então, com algumas adições à configuração do Nginx, podemos ter outra abordagem:

location / {
    # headers...

    resolver 192.168.1.1;

    # A regex to get the first part (hostname) from the Host header
    if ($http_host ~* "([a-z0-9-]+)(\.[a-z0-9-]+)*") {
        # Save a captured part from the regex to a variable
        set $redirect_hostname $1;
        # Pass the request to a desired backend
        proxy_pass   http://$redirect_hostname.private.mydomain.com$request_uri;
    }
}

O redirecionamento agora passa de http://myserver.cust.mydomain.com/foo/ para http://myserver.private.mydomain.com/foo/ . O servidor DNS pode manter endereços privados sob domínio diferente e a diretiva proxy_pass pode ser modificada para corresponder à configuração desejada do servidor de nomes.

Eu ainda acho que esse tipo de intermediação pode não ser a maneira mais fácil de resolver todo o quadro, mas é uma possibilidade afinal. Fico feliz se isso foi de alguma ajuda.

Referências: Wiki Nginx , especialmente HttpProxyModule e HttpRewriteModule

    
por 21.07.2011 / 09:46