Nginx: Como limitar a taxa de solicitações com base no agente do usuário

3

Tentando obter o seguinte comportamento trabalhando no nginx

Um limite de taxa padrão de 1r / s para cada ip ao usar um navegador. Um limite de taxa de 10r / s para sping e google spiders. Rejeitar robôs ruins.

Infelizmente o google não publica endereços IP para o googlebot, por isso estou limitado a useragent.

Até agora, isso chega perto:

http { 
  # Rate limits
  map $http_user_agent $uatype {
    default 'user';
    ~*(google|bing|msnbot) 'okbot';
    ~*(slurp|nastybot) 'badbot';
  }

  limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
  limit_req_zone $binary_remote_addr zone=two:10m rate=10r/s;

  ...

  server {
    ...

    location / {
      if ($uatype == 'badbot) {
        return 403;
      }

      limit_req zone=one burst=5 nodelay;
      if ($uatype != 'user') {
        limit_req zone=two burst=10 nodelay;
      }

      ...
    }

  ...
  }
}

MAS - 'se' não tem permissão para fazer isso.

$ nginx -t

nginx: [emerg] diretiva "limit_req" não é permitida aqui em /etc/nginx/nginx.conf nginx: arquivo de configuração /etc/nginx/nginx.conf teste falhou

Existem tantas sugestões não testadas nos fóruns do nginx que a maioria nem sequer passa no configtest.

Um que parece promissor é Limitação da taxa de Nginx por referenciador? - desvantagem de essa versão é que toda a configuração é repetida para cada limite diferente (eu tenho muitas regras de reescrita)

Alguém tem algo de bom?

    
por Ali W 25.10.2014 / 23:31

2 respostas

2

Infelizmente, você não pode dinamizar dessa forma, o módulo de solicitação de limite não suporta isso.

O link que você encontrou é provavelmente a única maneira de conseguir isso. Use a diretiva include para "evitar" a repetição da sua configuração.

Mas e se um rastreador de terceiros de repente representar um agente do usuário goodbot ?

    
por 26.10.2014 / 01:10
2

Hoje consegui implementar a limitação de taxa em uma base de agente do usuário; tente isso:

map $http_user_agent $bad_bot {
    default 0;
    (foo|bar) 1;
}

map $http_user_agent $nice_bot {
    default "";
    (baz|qux) 1;
}

limit_req_zone $nice_bot zone=one:10m rate=1r/s;
limit_req_status 429;

server {
    ...
    location / {
        limit_req zone=one nodelay;
        if ($badbot) {
            return 403;
        }
        ...
    }
}
    
por 12.05.2017 / 19:50