A Haproxy pode negar um pedido por IP se a sua mesa de apoio estiver cheia?

2

Nas configurações do haproxy, estou definindo uma tabela de tamanho 5 que armazena todos os endereços IP de entrada (por 1 minuto) e é definida como nopurge para que as novas entradas não sejam armazenadas na tabela. O que eu gostaria de ter acontecido é que eles seriam negados, mas isso não está acontecendo.

A linha da mesa é:

stick-table type ip size 5 expire 1m nopurge store gpc0

E todas as configurações são:

global
        maxconn 30000
        ulimit-n 65536
        log     127.0.0.1 local0
        log     127.0.0.1 local1 debug
        stats socket /var/run/haproxy.stat mode 600 level operator

defaults
        mode http
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms

backend fragile_backend
        tcp-request content  track-sc2 src
        stick-table type ip size 5 expire 1m nopurge store gpc0
        server fragile_backend1 A.B.C.D:80

frontend http_proxy
        bind *:80
        mode http
        option forwardfor
        default_backend fragile_backend

Eu confirmei (conectando as estatísticas do haproxy usando socat readline /var/run/haproxy.stat ) que a tabela-pau é preenchida com 5 endereços IP, mas depois todas as solicitações depois de um novo IP simplesmente passam - elas não são adicionadas a mesa de pau, nada é removido da mesa de pau, e o pedido não é negado.

O que eu gostaria de fazer é negar o pedido se a mesa estiver cheia. Isso é possível?

Estou usando o haproxy 1.5.

    
por bantic 10.03.2011 / 22:23

2 respostas

2

Como eu disse em outro thread, isso requer a adição de uma ACL muito simples para relatar o número de entradas usadas em uma tabela. É no máximo 10 linhas de código, incluindo a declaração de função, mas precisamos adicioná-la. Eu não tenho tempo agora, então estou adicionando isso à lista TODO e aceito uma contribuição se alguém encontrar tempo para isso.

    
por 15.03.2011 / 07:12
0

Parece que não é o comportamento que deve acontecer a partir da maneira como a documentação é redigida. Mas talvez você possa incrementar o GPC para cada IP na tabela e negar se é zero?:

src_get_gpc0(table) <integer>
  Returns the value of the first General Purpose Counter associated to the
  connection's source IPv4 address in the current proxy's stick-table or in
  the designated stick-table. If the address is not found, zero is returned.
  See also sc1/sc2_get_gpc0 and src_inc_gpc0.

Dito isso, seu backend é chamado de "fragile_backend". Se você estiver tentando limitar o número de conexões a um servidor, porque o servidor pode manipular apenas tantas conexões por vez, convém usar o parâmetro maxconn em sua definição de servidor. Usando isso, o HAPRoxy enfileirará as conexões além dessa quantidade. Você também pode estar interessado em:

be_conn <integer>
be_conn(backend) <integer>
  Applies to the number of currently established connections on the backend,
  possibly including the connection being evaluated. If no backend name is
  specified, the current one is used. But it is also possible to check another
  backend. It can be used to use a specific farm when the nominal one is full.
  See also the "fe_conn", "queue" and "be_sess_rate" criteria.
    
por 10.03.2011 / 22:55