Balanceamento de carga HTTPS com base em algum componente da URL

3

Temos um aplicativo existente que desejamos dividir em vários servidores (por exemplo: 1000 usuários no total, 100 usuários divididos em 10 servidores).

Idealmente, gostaríamos de poder retransmitir as solicitações HTTPS para um determinado servidor com base em algum componente do URL. Por exemplo:  Os usuários de 1 a 100 acessam o link  Os usuários de 2 a 200 acessam o link  etc. etc. etc.

Onde os pedidos recebidos são assim:   link {usuário inteiro # vai aqui} / caminho / para / arquivo

Alguém sabe de uma maneira fácil de fazer isso? Libra parece promissor ... mas não parece que ele ofereça suporte a roteamento com base em URL como este.

Ainda melhor seria se não precisasse ser codificado. O balanceador de carga poderia fazer um pedido HTTP separado para outro servidor para perguntar "Ei, que servidor eu deveria retransmitir para um pedido para URL {o URL que foi solicitado vai aqui}? "e retransmitir para o nome do host retornado na resposta HTTP.

    
por Keith Palmer Jr. 10.01.2011 / 16:45

5 respostas

2

O

Verniz provavelmente faria isso. Tal como acontece com outras opções mencionadas aqui você precisa de algo como libra na frente dele para atuar como um terminador SSL. No entanto, uma vez feito, você pode configurar cada servidor real como um "backend" e, em seguida, adicionar algo como o seguinte na configuração:

## Define the back end servers.
backend server01 {
    .host = "192.0.2.1";
    .port = "80";
}
backend server02 {
    .host = "192.0.2.2";
    .port = "80";
}

sub vcl_recv {
    if (req.url ~ "^/1[0-9][0-9]/"){
        ## If the first part of the link is 100-199 use server01
        set req.backend = server01;
        pipe;
    } else if (req.url ~ "^/2[0-9][0-9]/") {
        ## If the first part of the link is 200-299 use server02
        set req.backend = server02;
        pipe;
    } else {
        ## If all else fails fall back to server01 
        set req.backend = server01;
        pipe;
    }
}

Este é apenas um extrato das seções relevantes e provavelmente haverá mais requisitos na configuração. Por exemplo, você poderia adicionar o seguinte logo após sub vcl_recv { para armazenar em cache todos os arquivos estáticos para que os servidores não sejam atingidos sempre para arquivos que não mudam.

if (req.request == "GET" && req.url ~ "\.(png|jpg|gif|css)$") {
        lookup;

Você pode até adicionar pequenos programas em C na configuração para falar com um serviço externo e decidir qual back-end usar.

    
por 12.01.2011 / 03:25
1

Seria possível fazer isso com o reescritor de URLs em squid - observe que você precisa terminar o SSL na frente do proxy (por exemplo, stunnel ).

    
por 10.01.2011 / 17:19
0

Você tem recursos de codificação disponíveis? Eu fiz quase exatamente isso usando um pequeno programa no servidor do meio. Ele extrai o ID do usuário do URI, faz uma consulta do banco de dados para localizar o local de seus arquivos, busca o arquivo e, em seguida, o grava de volta para o usuário. Eu fiz isso usando um servlet Java, mas há muitas outras opções para realizar a mesma coisa.

    
por 12.01.2011 / 00:37
0

O HAProxy fará o que você está pedindo. Ele tem a capacidade de fazer o roteamento da Camada 7 com base no conteúdo da URL e é de código aberto.

    
por 12.01.2011 / 01:27
-1

Coisa semelhante pode ser alcançada com o nginx. O Nginx pode fazer terminações SSL e, em seguida, proxy suas solicitações para o back-end.

O seu requisito é específico de que os usuários 1-100 devem ir para um determinado servidor da Web ou os pedidos podem ser distribuídos uniformemente? Eu aconselho você a distribuí-los uniformemente. Ajudaria você a se espalhar e, assim, diminuir o risco.

    
por 10.01.2011 / 18:59