NGINX viene fornito con vari moduli per consentire agli utenti di controllare il traffico verso i propri siti Web, applicazioni Web e altre risorse Web. Uno dei motivi principali per limitare il traffico o l'accesso è prevenire abusi o attacchi di un certo tipo, ad esempio DoS (Negazione del servizio) attacchi.
Esistono tre modi principali per limitare l'uso o il traffico NGINX:
Quanto sopra NGINX gli approcci di gestione del traffico, a seconda del caso d'uso, possono essere configurati per limitare in base a una chiave definita, la più comune è l'indirizzo IP di un client. NGINX supporta anche altre variabili come un cookie di sessione e molte altre.
In questa prima parte della nostra serie in tre parti, discuteremo di come limitare il numero di connessioni in NGINX per salvaguardare i tuoi siti web/applicazioni.
Tieni presente che NGINX prenderà in considerazione una connessione per la limitazione solo se ha una richiesta in elaborazione dal server e l'intera intestazione della richiesta è già stata letta. Pertanto, non tutte le connessioni client vengono conteggiate.
Innanzitutto, è necessario definire una zona di memoria condivisa che memorizzi le metriche di connessione per varie chiavi, utilizzando il file limit_conn_zone direttiva. Come accennato in precedenza, una chiave può essere un testo, una variabile come l'indirizzo IP remoto di un client o una combinazione dei due.
Questa direttiva che è valida all'interno del contesto HTTP accetta due parametri: il chiave e il zona (nel formato nome_zona: dimensione).
limit_conn_zone $binary_remote_addr zone=limitconnbyaddr: 20m;
Per impostare un codice di stato della risposta che viene restituito alle richieste rifiutate, utilizzare il limit_conn_status direttiva che accetta un codice di stato HTTP come parametro. È valido nei contesti HTTP, server e posizione.
limit_conn_status 429;
Per limitare le connessioni, utilizzare il limin_conn direttiva per impostare la zona di memoria da utilizzare e il numero massimo di connessioni consentite, come mostrato nel frammento di configurazione seguente. Questa direttiva è valida nei contesti HTTP, server e posizione.
limit_conn limitconnbyaddr 50;
Ecco la configurazione completa:
api_service a monte { server 127.0.0.1:9051; server 10.1.1.77:9052; } limit_conn_zone $binary_remote_addr zone=limitconnbyaddr: 20m;limit_conn_status 429; server {ascolta 80; nome_server testapp.tecmint.com; radice /var/www/html/testapp.tecmint.com/build; indice index.html; limit_conn limitconnbyaddr 50;#include frammenti/pagine_error.conf; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; posizione / { file_prova $uri $uri/ /indice.html =404 =403 =500; } posizione /api { proxy_pass http://api_service; proxy_set_header X-Real-IP $indirizzo_remoto; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_versione 1.1; proxy_set_header Aggiorna $http_upgrade; proxy_set_header Connessione "aggiornamento"; } }
Salva il file e chiudilo.
Quindi controlla se il NGINX la configurazione va bene eseguendo il seguente comando:
$ sudo nginx -t.
Quindi, ricarica il NGINX servizio per effettuare le recenti modifiche:
$ sudo systemctl ricarica nginx.
Quando un client supera il numero massimo di connessioni consentite, NGINX restituisce un "429 Troppe richieste” errore al client e registra una voce come quella di seguito nel file di registro errori:
15/03/2022 00:14:00 [errore] 597443#0: *127 limitazione delle connessioni per zona "limitconnbyaddr", client: x.x.x.x, server: testapp.tecmimt.com, richiesta: "GET /static/css/main.63fdefff.chunk.css.map HTTP/1.1", host: "testapp.tecsimt.com"
Puoi anche limitare il numero di connessioni per un determinato server utilizzando il $nome_server variabile:
api_service a monte { server 127.0.0.1:9051; server 10.1.1.77:9052; } limit_conn_zone $nome_server zona=limitbyserver: 10m;limit_conn_status 429; server {ascolta 80; nome_server testapp.tecmint.com; radice /var/www/html/testapp.tecmint.com/build; indice index.html; limit_conn limitbyservers 2000;#include frammenti/pagine_error.conf; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; posizione / { file_prova $uri $uri/ /indice.html =404 =403 =500; } posizione /api { proxy_pass http://api_service; proxy_set_header X-Real-IP $indirizzo_remoto; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_versione 1.1; proxy_set_header Aggiorna $http_upgrade; proxy_set_header Connessione "aggiornamento"; } }
Questa configurazione abilita NGINX per limitare il numero totale di connessioni al server virtuale che alimenta l'applicazione testapp.tecmint.com, a 2000 connessioni.
Nota: Limitare le connessioni in base all'IP di un client ha uno svantaggio. Potresti finire per limitare le connessioni per più di un solo utente, soprattutto se molti utenti che accedono alla tua applicazione sono sulla stessa rete e operano dietro un NAT – tutte le loro connessioni avranno origine dallo stesso indirizzo IP.
In uno scenario del genere, puoi utilizzare una o più variabili disponibili in NGINX che possono identificare un client a livello di applicazione, un esempio è un cookie di sessione.
Potrebbero piacerti anche i seguenti articoli relativi a Nginx:
Per ora è tutto! Nella prossima parte di questa serie, discuteremo un'altra utile tecnica di gestione del traffico in NGINX – limitare la frequenza delle richieste. Fino ad allora, resta con noi.