Jak ograniczyć liczbę połączeń (żądań) w Nginx
- 3568
- 456
- Pani Janina Cieśla
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:
- Ograniczenie liczby połączeń (żądania).
- Ograniczenie stawki żądań.
- 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.
- « Jak tworzyć własną muzykę na Linux z Ardor
- 17 Przydatne narzędzia do monitorowania przepustowości do analizy użycia sieci w Linux »