NGINX - прохання дроселів запобігти зловживанням


28

Я хочу це зробити в тому, що користувачі розробляють проти нашого API з JavaScript, а деякі розробники накручують і викликають відвідувачів забивати сервер запитами AJAX. Коли це станеться, я хочу мати змогу зменшити запити API до 50 запитів на хвилину , або щось для цього.

Примітка: (особливо інтенсивні ресурси БД, тому, можливо, на рівні шляху, а не на сервері (наприклад, дросель "/ json_api /", але не "/ статичний /").

Відповіді:


36

Це можна зробити за допомогою LimitReqModule з Nginx. Однак якщо це для зворотного проксі, ви можете спробувати новий обмеження швидкості, підтримуване HAProxy .

Я знайшов обмеження швидкості nginx трохи заплутаним, щоб отримати точну швидкість, яку ви хочете.

Але у вас є щось на кшталт:

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

у httpрозділі, а потім у розділі щось подібне до locationцього server:

limit_req zone=default burst=10 nodelay;

Щоб не було його для певного розділу, як /staticви, просто зробіть це окремим, locationа не включіть у нього limit_reqдирективу (або зворотну).


Спасибі. Чи можете ви пояснити, що роблять ті речі (зона, зрив, вузол)? І, ви мали намір поставити zone=limit_req_zoneнатомість?
orokusaki

Чесно кажучи, я не можу їх так добре пояснити, тому я вважаю, що це просто заплутати. Пояснення Майкла у наданому нами посиланні звучить так, що це може бути здійсненним. Я не вірю, що я маю помилки, що стосується вашого другого питання ... Документація модуля, до якої я посилався, має приклад, який може допомогти.
Кайл Брандт

2
зона, зрив і затримка задокументовані на вікі-сторінці Nginx про модуль обмеження швидкості , пов'язаний вже з відповіді вище.
Марк Стосберг

Кайл, чи знаєш ти, чи є спосіб поєднати обмеження швидкості на місце розташування з іншим тригером (наприклад, Авторизація-заголовка). У моєму випадку я можу захотіти зменшити швидкість конкретного користувача.
Нільс

1
@Nils AFAICS ви можете використовувати $http_authorizationзмінну для визначення нової зони, де ключовим є такий заголовок, а не IP-адресу, тобто limit_req_zone $http_authorization zone = per_user : 10m rate = 5r/s, а потім використовувати per_userзону в розділах розташування, де ви хочете зробити обмеження швидкості для кожного користувача. Неперевірено, я лише читаю документацію та список змінних nginx ... дайте мені знати, якщо ви спробуєте це!
idrarig
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.