Rate limiting in Nginx is een ingebouwde functie die bepaalt hoeveel HTTP-verzoeken een client binnen een bepaalde periode kan doen. Hiermee kun je overmatig verkeer naar API’s, inlogpagina’s en toepassingen die veel systeembronnen gebruiken beperken, zonder extra software te installeren.
In deze handleiding configureer je verzoeklimieten in Nginx, test je ze veilig en schakel je de bescherming in op een Ubuntu-server.
Hoe werkt rate limiting in Nginx?
Nginx gebruikt de module limit_req om inkomende verzoeken bij te houden, meestal op basis van het IP-adres van de client.
Je kunt bijvoorbeeld een gemiddelde limiet van vijf verzoeken per seconde instellen en tegelijkertijd korte pieken in het verkeer toestaan. Verzoeken die de toegestane piek overschrijden, kunnen vervolgens worden geweigerd.
Dit helpt voorkomen dat je toepassing overbelast raakt door te veel verzoeken.
Opmerking: Rate limiting helpt bepaalde Layer 7-HTTP-floods te beperken. Het kan geen grootschalige DDoS-aanvallen op netwerkniveau stoppen die je verbinding verzadigen.

Vereisten
Je hebt een Ubuntu-server nodig waarop Nginx is geïnstalleerd, SSH-toegang met sudo-rechten en een bestaande website of toepassing.
Als je Nginx voor het eerst instelt, volg dan onze handleiding voor een Nginx-reverseproxy.
Maak een back-up van je bestaande websiteconfiguratie voordat je wijzigingen aanbrengt.
Stap 1: Definieer een zone voor rate limiting
Maak via SSH verbinding met je server.
Maak bij een standaardinstallatie van Nginx op Ubuntu een nieuw configuratiebestand aan:
sudo nano /etc/nginx/conf.d/rate-limit.conf
Voeg het volgende toe:
limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s;
Deze configuratie gebruikt het IP-adres van de client om verzoeken bij te houden, reserveert 10 MB voor de bijbehorende gegevens en stelt een gemiddelde limiet in van vijf verzoeken per seconde per IP-adres.
De instructie limit_req_zone moet binnen de http-context van Nginx staan. In de standaardconfiguratie van Ubuntu worden conf.d-bestanden daar opgenomen.
Sla het bestand op.
Stap 2: Schakel rate limiting in voor je website
Open je bestaande Nginx-configuratie voor de website:
sudo nano /etc/nginx/sites-available/app.example.com
Vervang de bestandsnaam door die van je eigen configuratiebestand.
Voor een HTTP-toepassing die op poort 3000 draait, kan een beveiligd API-eindpunt er zo uitzien:
location /api/ {
limit_req zone=perip burst=10 nodelay;
limit_req_status 429;
limit_req_dry_run on;
proxy_pass http://127.0.0.1:3000;
}
Dit doen de belangrijkste instructies:
limit_req: Past de eerder gedefinieerde limiet toe.burst=10: Staat een korte piek van extra verzoeken toe.nodelay: Verwerkt toegestane verzoeken tijdens een piek direct.limit_req_status 429: Geeft HTTP 429 terug wanneer verzoeken worden geweigerd.limit_req_dry_run on: Registreert overmatige verzoeken zonder ze te blokkeren.
Belangrijk: Voeg deze instructies voor rate limiting toe aan je bestaande, bijbehorende location-blok. Maak geen dubbele location-blokken aan en vervang je bestaande backendconfiguratie niet.
De getoonde waarden zijn voorbeelden. Kies limieten op basis van de normale verzoekpatronen van je toepassing.
Stap 3: Controleer je Nginx-configuratie
Controleer de configuratie:
sudo nginx -t
Als de test slaagt, laad je Nginx opnieuw:
sudo systemctl reload nginx
Als er een fout verschijnt, los je die op voordat je de configuratie opnieuw laadt.
Stap 4: Test de verzoeklimiet
Omdat de dry-run-modus is ingeschakeld, worden verzoeken nog niet geweigerd.
Houd het foutenlogboek van Nginx in de gaten:
sudo tail -f /var/log/nginx/error.log
Verstuur vanuit een andere terminal een kleine reeks testverzoeken naar een eindpunt dat je beheert:
for i in $(seq 1 15); do
curl -s -o /dev/null -w "%{http_code}\n" \
https://app.example.com/api/health
done
Vervang de URL door een werkend eindpunt van je eigen test- of stagingtoepassing.
Als verzoeken de limiet overschrijden, zou Nginx berichten met limiting requests, dry run in het foutenlogboek moeten registreren.
Je toepassing zou normaal moeten blijven reageren, omdat het weigeren van verzoeken nog niet is ingeschakeld.
Stap 5: Schakel rate limiting in
Wanneer je de resultaten hebt bekeken en hebt bevestigd dat je limieten geschikt zijn, verwijder je deze instructie uit het beveiligde location-blok:
limit_req_dry_run on;
Controleer de configuratie opnieuw en laad Nginx opnieuw:
sudo nginx -t
sudo systemctl reload nginx
Overmatige verzoeken kunnen nu de reactie HTTP 429 Too Many Requests krijgen.
Herhaal een gecontroleerde test en controleer de responscodes. De precieze resultaten hangen af van de timing van de verzoeken en de limieten die je hebt ingesteld.
De wijzigingen ongedaan maken
Als legitieme gebruikers hinder ondervinden, zet je het volgende terug:
limit_req_dry_run on;
Controleer de configuratie en laad Nginx opnieuw. Hierdoor keert de configuratie terug naar de monitoringmodus, waarin verzoeken niet worden geweigerd.
Daarna kun je de limieten aanpassen op basis van het werkelijke verkeer.
Belangrijk: Nginx achter Cloudflare of een andere CDN
Als Nginx achter een reverseproxy staat, kan het client-IP-adres dat Nginx ziet van de proxy zijn in plaats van van de oorspronkelijke bezoeker.
Als je dit niet corrigeert voordat je limieten per IP-adres toepast, kunnen niet-gerelateerde gebruikers als één groep worden behandeld.
Configureer de verwerking van vertrouwde client-IP-adressen met de Real IP-module van Nginx en de gedocumenteerde IP-bereiken van je proxyprovider voordat je limieten per client afdwingt.
Vertrouw nooit zomaar op IP-headers die bezoekers meesturen.
Vervangt rate limiting in Nginx DDoS-bescherming?
Nee. Nginx kan overmatige HTTP-verzoeken aan je toepassing beperken, maar kan geen verkeer filteren dat de upstreamnetwerkverbinding van je server al heeft verzadigd.
Combineer voor bredere bescherming maatregelen op toepassingsniveau met maatregelen op hostingniveau.
Onze handleiding over DDoS-bescherming legt uit hoe bescherming op netwerk- en toepassingsniveau elkaar aanvult.
Veelgestelde vragen
Ja. Nginx Open Source bevat de module limit_req.
Ja. Te strenge instellingen kunnen legitieme verzoeken weigeren, vooral wanneer meerdere gebruikers één IP-adres delen. Test de instellingen in dry-run-modus voordat je het weigeren van verzoeken inschakelt.
Ja. Het is vooral nuttig om overmatige verzoeken aan API-eindpunten en andere routes binnen een toepassing die veel systeembronnen gebruiken te beperken.
Conclusie
Nginx biedt ingebouwde rate limiting waarmee je overmatig HTTP-verkeer kunt beperken zonder extra software te installeren.
Configureer de verzoeklimiet, test deze in dry-run-modus en schakel het weigeren van verzoeken pas in nadat je de resultaten hebt bekeken.
Gebruik voor uitgebreide serverbescherming rate limiting naast passende DDoS-bescherming op upstreamniveau.