Jak ograniczyć liczbę połączeń (żądań) w Nginx

Jak ograniczyć liczbę połączeń (żądań) w Nginx

Nginx Wysyła z różnymi modułami, aby umożliwić użytkownikom kontrolowanie ruchu na swoich stronach internetowych, aplikacjach internetowych, a także innych zasobach internetowych. Jednym z kluczowych powodów ograniczenia ruchu lub dostępu jest zapobieganie nadużyciom lub atakom niektórych rodzajów, takich jak Dos (Odmowa usługi) Ataki.

Istnieją trzy główne sposoby ograniczania użytkowania lub ruchu Nginx:

  1. Ograniczenie liczby połączeń (żądania).
  2. Ograniczenie stawki żądań.
  3. Ograniczanie przepustowości.

Powyższe Nginx Podejścia do zarządzania ruchem, w zależności od przypadku użycia można skonfigurować do ograniczenia na podstawie zdefiniowanego klucza, co najczęstsze jest adres IP klienta. Nginx obsługuje również inne zmienne, takie jak plik cookie sesji i wiele innych.

W tej pierwszej części naszej trzyczęściowej serii omówimy, jak ograniczyć liczbę połączeń Nginx Aby zabezpieczyć swoje strony internetowe/aplikacje.

  • Jak ograniczyć liczbę połączeń (żądań) w Nginx - część 1
  • Jak ograniczyć szybkość połączeń (żądań) w Nginx - część 2
  • Jak ograniczyć użycie przepustowości w Nginx - część 3

Weź pod uwagę, że Nginx rozważy połączenie ograniczające tylko wtedy, gdy ma żądanie przetwarzane przez serwer, a cały nagłówek żądania został już odczytany. Dlatego nie liczone są wszystkie połączenia klientów.

Ograniczanie liczby połączeń w Nginx

Najpierw musisz zdefiniować wspólną strefę pamięci, która przechowuje wskaźniki połączenia dla różnych klawiszy, za pomocą limit_conn_zone dyrektywa. Jak wspomniano wcześniej, kluczem może być tekst, zmienna, taka jak zdalny adres IP klienta lub kombinacja tych dwóch.

Ta dyrektywa, która jest ważna w kontekście HTTP, przyjmuje dwa parametry: klucz i strefa (w formacie Zone_name: Rozmiar).

limit_conn_zone $ binary_remote_addr Zone = limitConnbyAddr: 20m; 

Aby ustawić kod stanu odpowiedzi, który jest zwracany do odrzuconych żądań, użyj limit_conn_status dyrektywa, która przyjmuje kod stanu HTTP jako parametr. Jest prawidłowy w kontekście HTTP, serwer i lokalizacji.

limit_conn_status 429; 

Aby ograniczyć połączenia, użyj limint_conn Dyrektywa, aby ustawić strefę pamięci, która ma być używana i maksymalna liczba dozwolonych połączeń, jak pokazano w poniższym fragmencie konfiguracji. Ta dyrektywa jest ważna w kontekście HTTP, serwer i lokalizacji.

limit_conn limitConnbyAddr 50; 

Oto pełna konfiguracja:

Upstream API_Service Server 127.0.0.1: 9051; serwer 10.1.1.77: 9052;  limit_conn_zone $ binary_remote_addr Zone = limitConnbyAddr: 20m; limit_conn_status 429; serwer Słuchaj 80; Server_name TestApp.Tecmint.com; root/var/www/html/testapp.Tecmint.com/build; indeks indeksu.html; limit_conn limitConnbyAddr 50; #Include Sneppets/Errber_pages.conf; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; lokalizacja / try_files $ URI $ URI / / Index.HTML = 404 = 403 = 500;  lokalizacja/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 aktualizację $ http_upgrade; Proxy_set_head Connection „Upgrade”;  
Ogranicz połączenia nginx

Zapisz plik i zamknij go.

Następnie sprawdź, czy Nginx Konfiguracja jest w porządku, uruchamiając następujące polecenie:

$ sudo nginx -t 

Następnie ponownie załaduj Nginx usługa w celu wprowadzenia ostatnich zmian:

$ sudo systemCtl Reload nginx 

Sprawdzanie limitu połączenia Nginx

Gdy klient przekroczy maksymalną liczbę dozwolonych połączeń, Nginx zwraca „429 zbyt wiele żądań„Błąd dla klienta i rejestruje wpis, taki jak ten poniżej w pliku dziennika błędów:

2022/03/15 00:14:00 [Błąd] 597443#0: *127 Połączenia ograniczające według strefy „LimitConnByaddr”, Klient: x.X.X.X, serwer: TestApp.Tecmimt.com, żądanie: „get/statyczny/css/main.63fDefff.kawałek.CSS.mapa http/1.1 ", host:„ TestApp.Tecmimt.com " 
Błąd limitu połączenia Nginx

Ograniczenie liczby połączeń z aplikacją

Możesz także ograniczyć liczbę połączeń dla danego serwera, używa $ Server_name zmienny:

Upstream API_Service Server 127.0.0.1: 9051; serwer 10.1.1.77: 9052;  limit_conn_zone $ server_name Zone = limitbyservers: 10m; limit_conn_status 429; serwer Słuchaj 80; Server_name TestApp.Tecmint.com; root/var/www/html/testapp.Tecmint.com/build; indeks indeksu.html; limit_conn limitbyservers 2000; #Include Sneppets/Errber_pages.conf; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; lokalizacja / try_files $ URI $ URI / / Index.HTML = 404 = 403 = 500;  lokalizacja/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 aktualizację $ http_upgrade; Proxy_set_head Connection „Upgrade”;  

Ta konfiguracja umożliwia Nginx Aby ograniczyć całkowitą liczbę połączeń z serwerem wirtualnym zasilającym aplikację TestApp.Tecmint.com, Do 2000 znajomości.

Notatka: Ograniczenie połączeń na podstawie adresu IP klienta ma wadę. Możesz ostatecznie ograniczyć połączenia dla więcej niż jednego użytkownika, zwłaszcza jeśli wielu użytkowników uzyskujących dostęp do aplikacji jest w tej samej sieci i działa za Nat - Wszystkie ich połączenia będą pochodzić z tego samego adresu IP.

W takim scenariuszu możesz zastosować jedną lub więcej zmiennych dostępnych w Nginx, które mogą zidentyfikować klienta na poziomie aplikacji, przykładem jest Sesyjne pliki cookie.

Możesz także spodobać się następujące artykuły związane z Nginx:

  • Jak utworzyć niestandardową stronę błędu 404 w Nginx
  • Jak kontrolować dostęp na podstawie adresu IP klienta w Nginx
  • Jak buforować zawartość w Nginx
  • Jak włączyć HTTP/2.0 w nginx
  • Jak używać Nginx jako balansu obciążenia HTTP w Linux

To wszystko na razie! W następnej części tej serii omówimy kolejną przydatną technikę zarządzania ruchem Nginx - Ograniczenie stawki żądań. Do tego czasu zostań z nami.