Slik begrenser du antall tilkoblinger (forespørsler) i NGINX
NGINX leveres med ulike moduler for å tillate brukere å kontrollere trafikk til sine nettsider, nettapplikasjoner og andre nettressurser. En av hovedårsakene til å begrense trafikk eller tilgang er å forhindre misbruk eller angrep av visse typer, for eksempel DoS (Denial of Service)-angrep.
Det er tre hovedmåter for å begrense bruk eller trafikk i NGINX:
- Begrensning av antall tilkoblinger (forespørsler).
- Begrense antallet forespørsler.
- Begrenser båndbredde.
Ovennevnte NGINX-trafikkstyringstilnærminger, avhengig av brukstilfellet, kan konfigureres til å begrense basert på en definert nøkkel, den vanligste er en klients IP-adresse. NGINX støtter også andre variabler som en øktinformasjonskapsel og mange flere.
I denne første delen av vår tredelte serie vil vi diskutere hvordan du begrenser antall tilkoblinger i NGINX for å beskytte nettstedene/applikasjonene dine.
- Slik begrenser du antall tilkoblinger (forespørsler) i NGINX – del 1
- Slik begrenser du frekvensen av tilkoblinger (forespørsler) i NGINX – del 2
- Slik begrenser du båndbreddebruk i NGINX – Del 3
Husk at NGINX vil vurdere en tilkobling for å begrense bare hvis den har en forespørsel som behandles av serveren og hele forespørselshodet allerede er lest. Derfor telles ikke alle klientforbindelser.
Begrensende antall tilkoblinger i NGINX
Først må du definere en delt minnesone som lagrer tilkoblingsverdier for ulike nøkler, ved å bruke limit_conn_zone-direktivet. Som nevnt før kan en nøkkel være en tekst, en variabel som klientens eksterne IP-adresse, eller en kombinasjon av de to.
Dette direktivet som er gyldig innenfor HTTP-konteksten tar to parametere: nøkkelen og sonen (i formatet sonenavn:størrelse).
limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;
For å angi en svarstatuskode som returneres til avviste forespørsler, bruk limit_conn_status-direktivet som tar en HTTP-statuskode som en parameter. Den er gyldig innenfor HTTP-, server- og plasseringskontekster.
limit_conn_status 429;
For å begrense tilkoblinger, bruk limint_conn-direktivet for å angi minnesonen som skal brukes og maksimalt antall tillatte tilkoblinger som vist i følgende konfigurasjonskodebit. Dette direktivet er gyldig innenfor HTTP-, server- og plasseringskontekster.
limit_conn limitconnbyaddr 50;
Her er den komplette konfigurasjonen:
upstream api_service {
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 {
listen 80;
server_name testapp.linux-console.net;
root /var/www/html/testapp.linux-console.net/build;
index index.html;
limit_conn limitconnbyaddr 50;
#include snippets/error_pages.conf;
proxy_read_timeout 600;
proxy_connect_timeout 600;
proxy_send_timeout 600;
location / {
try_files $uri $uri/ /index.html =404 =403 =500;
}
location /api {
proxy_pass http://api_service;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Lagre filen og lukk den.
Sjekk deretter om NGINX-konfigurasjonen er i orden ved å kjøre følgende kommando:
sudo nginx -t
Deretter laster du inn NGINX-tjenesten på nytt for å utføre de siste endringene:
sudo systemctl reload nginx
Sjekker Nginx Connection Limit
Når en klient overskrider det maksimale antallet tillatte tilkoblinger, returnerer NGINX en «429 for mange forespørsler»-feil til klienten og registrerer en oppføring som den nedenfor i feilen loggfil:
2022/03/15 00:14:00 [error] 597443#0: *127 limiting connections by zone "limitconnbyaddr", client: x.x.x.x, server: testapp.tecmimt.com, request: "GET /static/css/main.63fdefff.chunk.css.map HTTP/1.1", host: "testapp.tecmimt.com"
Begrenser Nginx-antall tilkoblinger til applikasjonen
Du kan også begrense antall tilkoblinger for en gitt server ved å bruke $server_name-variabelen:
upstream api_service {
server 127.0.0.1:9051;
server 10.1.1.77:9052;
}
limit_conn_zone $server_name zone=limitbyservers:10m;
limit_conn_status 429;
server {
listen 80;
server_name testapp.linux-console.net;
root /var/www/html/testapp.linux-console.net/build;
index index.html;
limit_conn limitbyservers 2000;
#include snippets/error_pages.conf;
proxy_read_timeout 600;
proxy_connect_timeout 600;
proxy_send_timeout 600;
location / {
try_files $uri $uri/ /index.html =404 =403 =500;
}
location /api {
proxy_pass http://api_service;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Denne konfigurasjonen gjør det mulig for NGINX å begrense det totale antallet tilkoblinger til den virtuelle serveren som driver applikasjonen testapp.linux-console.net, til 2000 tilkoblinger.
Merk: Å begrense tilkoblinger basert på en klients IP har en ulempe. Du kan ende opp med å begrense tilkoblinger for mer enn bare én bruker, spesielt hvis mange brukere som får tilgang til applikasjonen din er på samme nettverk og opererer bak en NAT – alle tilkoblingene deres kommer fra den samme IP-adressen.
I et slikt scenario kan du bruke én eller flere variabler tilgjengelig i NGINX som kan identifisere en klient på applikasjonsnivå, et eksempel er en session cookie.
Du vil kanskje også like følgende Nginx-relaterte artikler:
- Hvordan lage tilpasset 404-feilside i NGINX
- Slik kontrollerer du tilgang basert på klientens IP-adresse i NGINX
- Hvordan bufre innhold i NGINX
- Slik aktiverer du HTTP/2.0 i Nginx
- Hvordan bruke Nginx som en HTTP-belastningsbalanser i Linux
Det var det for nå! I neste del av denne serien vil vi diskutere en annen nyttig trafikkstyringsteknikk i NGINX – begrense antallet forespørsler. Inntil da, bli hos oss.