Come impostare il limite in nginx, ma includere / escludere determinati indirizzi IP?

Sono in grado di utilizzare limit_req per valutare-limite tutte le richieste al mio server.

Tuttavia, vorrei rimuovere la restrizione di tasso per alcuni indirizzi IP (ovvero whitelist) e utilizzare una restrizione di tasso diversa per alcuni altri (ovvero alcuni IP che vorrei come 1r / s).

  • UnicodeEncodeError quando carichi i file in Django admin
  • il pass di proxy nginx reindirizza l'ignorare la port
  • Permessi di file statici con Nginx, Gunicorn e Django
  • Perché il mio alias nginx non funziona?
  • nginx + django che serve file statici
  • Variabili nel nome di log - nginx
  • Ho provato a utilizzare condizionali (ad esempio, if ( $remote_addr = "1.2.3.4" ) {} ) ma che sembra funzionare solo con le regole di riscrittura, non per le regole di limitazione del tasso.

    2 Solutions collect form web for “Come impostare il limite in nginx, ma includere / escludere determinati indirizzi IP?”

    È meglio evitare di usare la direttiva "se". Quando la chiave in limite_req_zone (e limit_conn_zone) è vuota, i limiti non vengono applicati. È ansible utilizzare questo in combinazione con la mappa e i moduli geo per creare un elenco di IP in cui i limiti di farfalla non vengono applicati.

    Questo esempio mostra come configurare un limite per le richieste simultanee e la velocità di richiesta da un singolo IP.

     http { geo $whitelist { default 0; # CIDR in the list below are not limited 1.2.3.0/24 1; 9.10.11.12/32 1; 127.0.0.1/32 1; } map $whitelist $limit { 0 $binary_remote_addr; 1 ""; } # The directives below limit concurrent connections from a # non-whitelisted IP address to five limit_conn_zone $limit zone=connlimit:10m; limit_conn connlimit 5; limit_conn_log_level warn; # logging level when threshold exceeded limit_conn_status 503; # the error code to return # The code below limits the number requests from a non-whitelisted IP # to one every two seconds with up to 3 requests per IP delayed # until the average time between responses reaches the threshold. # Further requests over and above this limit will result # in an immediate 503 error. limit_req_zone $limit zone=one:10m rate=30r/m; limit_req zone=one burst=3; limit_req_log_level warn; limit_req_status 503; 

    Le direttive di zona devono essere collocate a livello di http, tuttavia le altre direttive possono essere posizionate più in basso, ad esempio nel server o nel livello di localizzazione per limitarne la portta o addirittura adattare i limiti.

    Per ulteriori informazioni consultare la documentazione nginx ngx_http_limit_req_module e ngx_http_limit_conn_module

    È ansible utilizzare in modo sicuro le posizioni denominate, ad esempio "@location" in un block if ().

    Vedi: http://wiki.nginx.org/IfIsEvil

    Qualcosa di simile dovrebbe funzionare:

     http { limit_req_zone $binary_remote_addr zone=delay:10m rate=1r/m; server { ... error_page 410 = @slowdown; if( $remote_addr != "1.2.3.4" ) { return 410; } location @slowdown { limit_req zone=delay burst 5; ... } location / { ... } } 

    Compilare "location @slowdown {}" con le stesse informazioni di "location / {}, ad esempio proxy_pass se si utilizza nginx come proxy inverso.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.