NGINX - richieste di limitazione per prevenire abusi


28

Il motivo per cui voglio farlo è perché gli utenti si sviluppano contro la nostra API con JavaScript e alcuni sviluppatori sbagliano e fanno sì che i visitatori sbattano il server con richieste AJAX. Quando ciò accade, voglio essere in grado di limitare le richieste API a forse 50 richieste al minuto o qualcosa in tal senso.

Nota: (in particolare risorse ad uso intensivo di DB, quindi forse a livello di percorso, piuttosto che a livello di server (ad es. Acceleratore "/ json_api /", ma non "/ static /").

Risposte:


36

Questo può essere fatto usando LimitReqModule con Nginx. Tuttavia, se questo è per un proxy inverso, potresti provare il nuovo limite di velocità supportato da HAProxy .

Ho trovato che il tasso di nginx limitante fosse un po 'confuso per ottenere il tasso esatto che desideri.

Ma fondamentalmente hai qualcosa del tipo:

limit_req_zone  $binary_remote_addr  zone=default:10m   rate=50r/m;

nella httpsezione e quindi qualcosa di simile al seguente nella locationsezione all'interno della serversezione:

limit_req zone=default burst=10 nodelay;

Al fine di non averlo per una certa sezione come /staticte, ne farei solo una separata locatione non la includerebbe come limit_reqdirettiva (o inversa).


Grazie. Puoi spiegare cosa stanno facendo queste cose (zona, scoppio, nodelay)? E intendevi mettere zone=limit_req_zone, invece?
Orokusaki,

Onestamente non riesco a spiegarli così bene, motivo per cui sento che è solo confuso. La spiegazione di Michael nel link che ho fornito sembra essere fattibile. Non credo di avere errori di battitura per quanto riguarda la tua seconda domanda ... La documentazione del modulo che ho collegato ha un esempio che potrebbe aiutare.
Kyle Brandt,

2
zone, burst e nodelay sono documentati nella pagina wiki di Nginx sul modulo di limitazione della frequenza , collegato a già dalla risposta sopra.
Mark Stosberg,

Kyle, sai se esiste un modo per combinare il limite di velocità per posizione con un altro trigger (ad es. Autorizzazione-intestazione). Nel mio caso, potrei voler limitare la velocità di un utente specifico.
Nils,

1
@Nils AFAICS è possibile utilizzare la $http_authorizationvariabile per definire una nuova zona in cui la chiave è tale intestazione anziché l'indirizzo IP, ovvero, limit_req_zone $http_authorization zone = per_user : 10m rate = 5r/squindi utilizzare la per_userzona nelle sezioni della posizione in cui si desidera eseguire la limitazione della frequenza per utente. Non testato, ho appena letto la documentazione e l'elenco delle variabili nginx ... fammi sapere se lo provi!
idrarig,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.