Erros de limite de taxa embora o IP esteja na lista de permissões

Estamos usando o Discourse em um contêiner Docker. Temos limites de taxa configurados com um IP em lista de permissões. No entanto, ainda estamos recebendo erros de limite de taxa ao fazer solicitações desse IP. Tenho certeza de que a configuração do nginx está correta, veja como ela se parece:

geo $limit {
    default 1;
    1.1.1.1 0; # não é o IP real
}

map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}

limit_req_zone $limit_key zone=flood:10m rate=12r/s;
limit_req_zone $limit_key zone=bot:10m rate=200r/m;
limit_req_status 429;
limit_conn_zone $limit_key zone=connperip:10m;
limit_conn_status 429;

...
  location @discourse {
    limit_conn connperip 20;
    limit_req zone=flood burst=12 nodelay;
    limit_req zone=bot burst=100 nodelay;
   ...
  }

O nginx está configurado para registrar um erro caso um limite de taxa tenha sido atingido e estamos de fato vendo alguma mensagem de log - mas nenhuma do IP em lista de permissões. Ainda assim, estamos recebendo muitos 429 ao fazer solicitações do IP em lista de permissões. As URLs das solicitações são perfis de usuário (por exemplo, /users/foo.json). Existe algum tipo de limite de taxa no próprio Discourse?

2 curtidas

Olá, Nginx está de fato gerenciando a limitação de taxa como você afirmou, mas o Discourse também tem sua própria maneira de gerenciar a limitação de taxa no nível do aplicativo. Sam tem um artigo interessante sobre isso:

A única coisa que estou me perguntando é se podemos realmente limitar a taxa com exceções (ou seja, colocar IPs em uma lista de permissões através dessas regras). Ainda estou procurando uma maneira de fazer isso… :sweat_smile:

Ok, acho que estou chegando a algo:

Talvez DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS seja exatamente o que precisávamos :grin:

1 curtida

Eu também estou atingindo um limite de 60 chamadas para a API por minuto, o que não consigo resolver. Configurei todos estes:

      - DISCOURSE_MAX_REQS_PER_IP_MODE=none
      - DISCOURSE_MAX_USER_API_REQS_PER_MINUTE=20000
      - DISCOURSE_MAX_USER_API_REQS_PER_DAY=30000
      - DISCOURSE_MAX_ADMIN_API_REQS_PER_MINUTE=20000
      - DISCOURSE_MAX_REQS_PER_IP_PER_MINUTE=20000
      - DISCOURSE_MAX_REQS_PER_IP_PER_10_SECONDS=2000
      - DISCOURSE_MAX_ASSET_REQS_PER_IP_PER_10_SECONDS=2000
      - DISCOURSE_SKIP_PER_IP_RATE_LIMIT_TRUST_LEVEL=0
      - DISCOURSE_MAX_ADMIN_API_REQS_PER_KEY_PER_MINUTE=20000
      - DISCOURSE_MESSAGE_BUS_MAX_BACKLOG_SIZE=1000
      - DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS=....

Eu sei que não é o nginx porque estou recebendo a mensagem “Você realizou esta ação muitas vezes”, o que significa que o Discourse RateLimiter está lidando com isso.

Você encontrou uma solução?

2 curtidas