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:

  1. Begrensning av antall tilkoblinger (forespørsler).
  2. Begrense antallet forespørsler.
  3. 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.