Errori di rate limiting anche se l'IP è in whitelist

Stiamo utilizzando Discourse in un container Docker. Abbiamo impostato dei limiti di frequenza con un IP in whitelist. Tuttavia, stiamo ancora ricevendo errori di limite di frequenza quando effettuiamo richieste da quell’IP. Sono abbastanza sicuro che la configurazione di nginx sia corretta, ecco come appare:

geo $limit {
    default 1;
    1.1.1.1 0; # non l'IP reale
}

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;
   ...
  }

nginx è configurato per registrare un errore nel caso in cui sia stato raggiunto un limite di frequenza e stiamo effettivamente vedendo alcuni messaggi di log, ma nessuno dall’IP in whitelist. Tuttavia, stiamo ricevendo tonnellate di 429 quando effettuiamo richieste dall’IP in whitelist. Gli URL delle richieste sono profili utente (ad esempio, /users/foo.json). Esiste una sorta di limite di frequenza in Discourse stesso?

2 Mi Piace

Ciao, Nginx sta effettivamente gestendo il rate limiting come hai affermato, ma Discourse ha anche il suo modo di gestire il rate limiting a livello di applicazione. Sam ha un articolo interessante a riguardo:

L’unica cosa che mi chiedo è se possiamo effettivamente limitare la frequenza con eccezioni (cioè, inserire IP in whitelist attraverso queste regole). Sto ancora cercando un modo per farlo… :sweat_smile:

Okay, penso di essere sulla strada giusta:

Forse DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS è proprio quello di cui avevamo bisogno :grin:

1 Mi Piace

Anch’io sto riscontrando un limite di 60 chiamate all’API al minuto che non riesco a risolvere. Ho impostato tutto questo:

      - 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=....

So che non è nginx perché ricevo il messaggio “Hai eseguito questa azione troppe volte”, il che significa che il Discourse RateLimiter la sta gestendo.

Hai trovato una soluzione?

2 Mi Piace