Como limitar sessões concorrentes com nginx ou haproxy?

2

Atualmente, estou usando o nginx para solicitações de proxy reverso de clientes da web que estão fazendo sondagens longas para um desenvolvedor.

Como estamos fazendo uma pesquisa longa (em oposição a websockets), quando um cliente se conecta, ele fará várias conexões http com o servidor em série, restabelecendo uma conexão toda vez que o servidor enviar alguns dados (ou expirar o tempo limite) e restabelecer se o servidor não tem nada a dizer por 10 segundos).

O que eu gostaria de fazer é limitar o número de clientes da Web simultâneos. Como os clientes estão constantemente fazendo novas solicitações HTTP em vez de manter uma única solicitação aberta, é um pouco complicado contar o número total de clientes da web (porque não é o mesmo que o número total de clientes http conectados simultaneamente).

O método que desenvolvi é rastrear solicitações http pelo endereço IP de origem e armazenar o endereço IP em algum lugar com um TTL de 20 segundos. Se uma solicitação chegar em cujo IP não é reconhecido, verificaremos o número total de endereços IP armazenados não expirados; se isso for menor que o máximo, então permitimos que essa solicitação seja feita. E se uma solicitação chegar com um endereço IP que possamos encontrar na tabela de consulta que ainda não expirou, ela também será permitida. Todas as solicitações permitidas têm seus IPs adicionados à tabela (se não houver antes) e o TTL é atualizado novamente para 20 segundos.

Na verdade, eu tinha juntado algo que funcionava corretamente dessa forma usando o nginx junto com o módulo Redis 2.0 Nginx ( e o módulo nginx lua para simplificar a ramificação condicional), usando redis para armazenar meus endereços IP com um TTL (o comando SETEX ) e verificando o tamanho da tabela com o comando DBSIZE .

Isso funcionou, mas o desempenho foi horrível. O nginx e o redis acabaram usando muita cpu e a máquina só conseguiu lidar com um número muito pequeno de solicitações simultâneas.

Os novos stick-table e contadores de rastreamento que foram adicionados ao Haproxy na versão 1.5 (por meio de uma comissão do serverfault ) parece que eles podem ser ideais para implementar exatamente esse tipo de limitação de taxa, porque a tabela-pau pode rastrear endereços IP e expirar entradas automaticamente. No entanto, não vejo uma maneira fácil de obter uma contagem total das entradas não expiradas na tabela, o que seria necessário para saber o número de clientes da Web conectados.

Estou curioso para saber se alguém tem alguma sugestão, para nginx ou haproxy ou mesmo para outra coisa que não tenha sido mencionada aqui e em que ainda não tenha pensado.

    
por bantic 10.03.2011 / 19:58

1 resposta

1

Não há nada de incrível agora para relatar o número de entradas em uma tabela para uso com as ACLs, embora seja provavelmente um patch de 10 linhas para adicionar ao haproxy 1.5, se isso puder ajudar.

Se acontecer de você mesmo, por favor envie para mim e eu vou mesclar em mainline. Caso contrário, faça-me um ping off-list para que eu não esqueça de adicionar isso.

    
por 14.03.2011 / 07:38