Ograniczanie liczby żądań w Nginx to wbudowana funkcja, która kontroluje, ile żądań HTTP może wysłać klient w określonym czasie. Pozwala ograniczyć szkodliwy ruch kierowany do API, stron logowania i aplikacji intensywnie wykorzystujących zasoby bez instalowania dodatkowego oprogramowania.
W tym poradniku skonfigurujesz limity żądań w Nginx, bezpiecznie je przetestujesz i włączysz ochronę na serwerze Ubuntu.
Jak działa ograniczanie liczby żądań w Nginx?
Nginx używa modułu limit_req do śledzenia przychodzących żądań, zazwyczaj na podstawie adresu IP klienta.
Możesz na przykład ustawić średni limit pięciu żądań na sekundę, dopuszczając jednocześnie krótkotrwałe wzrosty ruchu. Żądania przekraczające dozwolony poziom takiego wzrostu mogą być odrzucane.
Pomaga to zapobiec przeciążeniu aplikacji nadmierną liczbą żądań.
Uwaga: Ograniczanie liczby żądań pomaga łagodzić skutki niektórych ataków HTTP flood na warstwie 7. Nie powstrzyma jednak dużych ataków DDoS na poziomie sieci, które wysycają łącze.

Wymagania wstępne
Potrzebujesz serwera Ubuntu z zainstalowanym Nginx, dostępu przez SSH z uprawnieniami sudo oraz istniejącej witryny lub aplikacji.
Jeśli konfigurujesz Nginx po raz pierwszy, skorzystaj z naszego poradnika dotyczącego konfiguracji Nginx jako serwera reverse proxy.
Przed wprowadzeniem zmian wykonaj kopię zapasową istniejącej konfiguracji witryny.
Krok 1: Zdefiniuj strefę ograniczania liczby żądań
Połącz się z serwerem przez SSH.
W standardowej instalacji Nginx na Ubuntu utwórz nowy plik konfiguracyjny:
sudo nano /etc/nginx/conf.d/rate-limit.conf
Dodaj:
limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s;
Ta konfiguracja wykorzystuje adres IP klienta do śledzenia żądań, przydziela 10 MB na dane służące do ich śledzenia i ustawia średni limit pięciu żądań na sekundę dla każdego adresu IP.
Dyrektywa limit_req_zone musi znajdować się w kontekście http Nginx. Standardowa konfiguracja Ubuntu uwzględnia w tym kontekście pliki z katalogu conf.d.
Zapisz plik.
Krok 2: Włącz ograniczanie liczby żądań dla swojej witryny
Otwórz istniejący plik konfiguracyjny witryny w Nginx:
sudo nano /etc/nginx/sites-available/app.example.com
Zastąp nazwę pliku nazwą swojego pliku konfiguracyjnego.
W przypadku aplikacji HTTP działającej na porcie 3000 chroniony punkt końcowy API może wyglądać tak:
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;
}
Oto, za co odpowiadają najważniejsze dyrektywy:
limit_req: Stosuje wcześniej zdefiniowany limit.burst=10: Dopuszcza krótkotrwały wzrost liczby żądań ponad limit.nodelay: Przetwarza natychmiast żądania dopuszczone w ramach krótkotrwałego wzrostu.limit_req_status 429: Zwraca kod HTTP 429 po odrzuceniu żądań.limit_req_dry_run on: Rejestruje żądania przekraczające limit bez ich blokowania.
Ważne: Dodaj te dyrektywy ograniczania liczby żądań do istniejącego bloku location obsługującego dany adres. Nie twórz zduplikowanych bloków lokalizacji ani nie zastępuj istniejącej konfiguracji serwera zaplecza.
Podane wartości są przykładowe. Dobierz limity na podstawie typowych wzorców żądań w swojej aplikacji.
Krok 3: Sprawdź poprawność konfiguracji Nginx
Sprawdź konfigurację:
sudo nginx -t
Jeśli test zakończy się pomyślnie, przeładuj konfigurację Nginx:
sudo systemctl reload nginx
Jeśli pojawi się błąd, popraw go przed przeładowaniem konfiguracji.
Krok 4: Przetestuj limit liczby żądań
Ponieważ tryb próbny jest włączony, żądania nie będą jeszcze odrzucane.
Monitoruj dziennik błędów Nginx:
sudo tail -f /var/log/nginx/error.log
Z innego terminala wyślij krótką serię żądań testowych do punktu końcowego, który kontrolujesz:
for i in $(seq 1 15); do
curl -s -o /dev/null -w "%{http_code}\n" \
https://app.example.com/api/health
done
Zastąp adres URL adresem działającego punktu końcowego we własnej aplikacji testowej lub środowisku przejściowym.
Jeśli żądania przekroczą limit, Nginx powinien zapisać w dzienniku błędów komunikaty zawierające limiting requests, dry run.
Aplikacja powinna nadal zwracać zwykłe odpowiedzi, ponieważ blokowanie żądań nie zostało włączone.
Krok 5: Włącz ograniczanie liczby żądań
Po przeanalizowaniu wyników i upewnieniu się, że limity są odpowiednie, usuń tę dyrektywę z chronionego bloku lokalizacji:
limit_req_dry_run on;
Ponownie sprawdź poprawność konfiguracji i przeładuj ją w Nginx:
sudo nginx -t
sudo systemctl reload nginx
Żądania przekraczające limit mogą teraz otrzymać odpowiedź HTTP 429 Too Many Requests.
Powtórz test w kontrolowanych warunkach i sprawdź kody odpowiedzi. Dokładne wyniki zależą od czasu wysyłania żądań i skonfigurowanych limitów.
Jak cofnąć zmiany
Jeśli zmiany wpływają na uprawnionych użytkowników, przywróć:
limit_req_dry_run on;
Sprawdź poprawność konfiguracji i przeładuj ją w Nginx. Spowoduje to powrót do trybu monitorowania bez odrzucania żądań.
Następnie możesz dostosować limity na podstawie rzeczywistego ruchu.
Ważne: Nginx za Cloudflare lub inną siecią CDN
Gdy Nginx działa za serwerem reverse proxy, widoczny dla niego adres IP klienta może należeć do serwera proxy, a nie do pierwotnego odwiedzającego.
Stosowanie limitów dla poszczególnych adresów IP bez skorygowania tego problemu może spowodować, że niezwiązani ze sobą użytkownicy będą traktowani jako jedna grupa.
Przed włączeniem limitów dla poszczególnych klientów skonfiguruj obsługę zaufanych adresów IP klientów za pomocą modułu Real IP w Nginx oraz zakresów adresów IP udokumentowanych przez dostawcę serwera proxy.
Nigdy nie ufaj nagłówkom z adresami IP podawanym przez dowolnych odwiedzających.
Czy ograniczanie liczby żądań w Nginx zastępuje ochronę przed atakami DDoS?
Nie. Nginx może ograniczać nadmierną liczbę żądań HTTP docierających do aplikacji, ale nie może filtrować ruchu, który już wysycił łącze sieciowe serwera.
Aby uzyskać szerszą ochronę, połącz mechanizmy na poziomie aplikacji z ochroną zapewnianą na poziomie infrastruktury hostingowej.
Nasz poradnik dotyczący ochrony przed atakami DDoS wyjaśnia, jak zabezpieczenia na poziomie sieci i aplikacji wzajemnie się uzupełniają.
Często zadawane pytania
Tak. Nginx Open Source zawiera moduł limit_req.
Tak. Zbyt rygorystyczne ustawienia mogą powodować odrzucanie prawidłowych żądań, zwłaszcza gdy kilku użytkowników korzysta z tego samego adresu IP. Przetestuj konfigurację w trybie próbnym przed włączeniem blokowania.
Tak. Jest szczególnie przydatne do kontrolowania nadmiernej liczby żądań kierowanych do punktów końcowych API i innych zasobochłonnych ścieżek aplikacji.
Podsumowanie
Nginx ma wbudowaną funkcję ograniczania liczby żądań, która pomaga zmniejszyć szkodliwy ruch HTTP bez konieczności instalowania dodatkowego oprogramowania.
Skonfiguruj limit liczby żądań, przetestuj go w trybie próbnym i włącz blokowanie dopiero po przeanalizowaniu wyników.
Aby zapewnić serwerowi kompleksową ochronę, stosuj ograniczanie liczby żądań wraz z odpowiednimi zabezpieczeniami przed atakami DDoS na wcześniejszych etapach obsługi ruchu.