NGINX - żądania przepustnicy, aby zapobiec nadużyciom

28

Powodem, dla którego chcę to zrobić, jest to, że użytkownicy rozwijają się w oparciu o nasz interfejs API za pomocą JavaScript, a niektórzy programiści psują się i powodują, że odwiedzający trzasną serwer żądaniami AJAX. Kiedy tak się stanie, chcę być w stanie ograniczyć żądania API do około 50 żądań na minutę lub coś w tym rodzaju.

Uwaga: (szczególnie zasoby intensywnie korzystające z DB, więc być może na poziomie ścieżki, a nie całego serwera (np. Przepustnica „/ json_api /”, ale nie „/ static /”).

orokusaki
źródło

Odpowiedzi:

36

Można to zrobić za pomocą LimitReqModule z Nginx. Jeśli jednak dotyczy to odwrotnego proxy, możesz wypróbować nowe ograniczenie prędkości obsługiwane przez HAProxy .

Stwierdziłem, że ograniczenie szybkości Nginx jest nieco mylące, aby uzyskać dokładnie taką szybkość, jakiej chcesz.

Ale w zasadzie masz coś takiego:

limit_req_zone  $binary_remote_addr  zone=default:10m   rate=50r/m;

w httpsekcji, a następnie coś podobnego do następującego w locationsekcji w serversekcji:

limit_req zone=default burst=10 nodelay;

Aby nie mieć go dla określonej sekcji, takiej jak /staticty, po prostu uczyń go osobnym locationi nie dołączaj go do limit_reqdyrektywy (lub odwrotnie).

Kyle Brandt
źródło
dzięki. Czy możesz wyjaśnić, co te rzeczy robią (strefa, wybuch, opóźnienie)? Czy zone=limit_req_zonezamiast tego chciałeś powiedzieć ?
orokusaki,
Szczerze mówiąc, nie potrafię ich tak dobrze wyjaśnić, dlatego uważam, że to tylko mylące. Wyjaśnienie Michaela w linku, który podałem, brzmi jakby to było wykonalne. Nie sądzę, że mam jakieś literówki, jeśli chodzi o twoje drugie pytanie ... Dokumentacja modułu, z którą się łączyłem, zawiera przykład, który może pomóc.
Kyle Brandt,
2
zone, burst i nodelay są udokumentowane na stronie wiki Nginx o module ograniczającym szybkość , do którego link znajduje się już w powyższej odpowiedzi.
Mark Stosberg
Kyle, czy wiesz, czy istnieje sposób na połączenie limitu prędkości na lokalizację z innym wyzwalaczem (np. Nagłówek autoryzacji). W moim przypadku mogę chcieć zmniejszyć tempo określonego użytkownika.
Nils
1
@Nils AFAICS możesz użyć $http_authorizationzmiennej, aby zdefiniować nową strefę, w której kluczem jest taki nagłówek, a nie adres IP, tj. limit_req_zone $http_authorization zone = per_user : 10m rate = 5r/s, A następnie użyć per_userstrefy w sekcjach lokalizacji, w których chcesz wprowadzić ograniczenie prędkości dla użytkownika. Nieprzetestowane, tylko czytam dokumentację i listę zmiennych nginx ... daj mi znać, jeśli spróbujesz tego!
idrarig