Encaminhar solicitações para um dos vários convidados no host KVM?

1

Eu tenho uma máquina host Ubuntu com 3 convidados. Todos eles têm diferentes webservices em execução na porta 80. Como posso dizer ao host para encaminhar a solicitação para o convidado apropriado com base no nome do host?

Anfitrião: example.com

Convidados: git.example.com, www.example.com, psql.example.com

    
por Cojones 29.12.2011 / 16:59

3 respostas

7

Como você precisa rotear com base no hostname em vez de port, a solução iptables do NAT para o tráfego para as VMs está fora.

O que resta é a execução de um servidor da Web no modo de proxy reverso, que lê o cabeçalho do host de solicitação e os proxies para os diferentes IPs privados com base no cabeçalho da solicitação.

A configuração exata dependerá de qual servidor da Web você usará e de qual servidor da Web você selecionará dependerá de quais recursos são necessários (SSL?), além de preferências pessoais. Deixe-me saber qual servidor da Web você prefere e posso editar a resposta para incluir um exemplo de configuração, se necessário.

edit: Configuração básica do nginx:

http {

    # ...existing config basics... server_name, NOT servername

    server {
        listen 80;
        server_name git.example.com;
        location / {
            # git server IP below:
            proxy_pass http://10.x.x.x:80/;
            # re-send the host header - this may not be necessary
            proxy_set_header Host $host;
            # set the X-Forwarded-For header, so that the public IP of the client is available to the backend server
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    server {
        listen 80;
        server_name psql.example.com;
        location / {
            # psql server IP below:
            proxy_pass http://10.x.x.x:80/;
            # re-send the host header - this may not be necessary
            proxy_set_header Host $host;
            # set the X-Forwarded-For header, so that the public IP of the client is available to the backend server
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    server {
        listen 80;
        server_name www.example.com;
        location / {
            # www server IP below:
            proxy_pass http://10.x.x.x:80/;
            # re-send the host header - this may not be necessary
            proxy_set_header Host $host;
            # set the X-Forwarded-For header, so that the public IP of the client is available to the backend server
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}
    
por 29.12.2011 / 17:18
0

Você tem que instalar em um host, que tem acesso à Internet, servidor web e usar "configuração de hosts virtuais baseados em nome" (tente usar no google com o nome do seu servidor web). Todos os virtuais baseados em nome precisam ser um proxy para um servidor virtual. Você pode usar o apache, nginx, lighttpd, sempre que quiser ...

    
por 29.12.2011 / 17:21
0

Bridge todas as conexões. Dessa forma, seus convidados podem adquirir IP na mesma rede que o host. Agora adicione um registro "A" para esses três convidados no DNS.

Lembre-se de que, se a solicitação for para git.example.com, nunca chegará a example.com, a menos que você tenha um "CNAME" definido para o mesmo.

[EDITAR com base no comentário]
Como você não pode usar o DNS, eu recomendaria não executar máquinas virtuais. Em vez disso, crie alguns hosts virtuais e use-os. Em seu nginx apenas defina o server_name múltiplo. Verifique o wiki nginx para um exemplo.

    
por 29.12.2011 / 17:05