Як налаштувати nginx для повернення 429 http-коду при обмеженні швидкості?


11

Як налаштувати nginx для повернення коду статусу http 429 (Занадто багато запитів) замість 503 за замовчуванням (Служба недоступна) під час обмеження / обмеження швидкості?

FYI, я використовую nginx як зворотний проксі з HttpLimitReqModule. Специфікація проекту коду статусу 429 - RFC6585 .

Це (закрите) запитання про stackexchanged показує, що можна використовувати директиву error_page . Однак я не хочу повертати номер 429, якщо дійсно є проблема з сервером (якщо клієнт не надто сильно б’є нас) і сервер повинен повертати 503 Сервіс недоступний.

Будь-які пропозиції?


FYI, я створив запит на вдосконалення для цієї функції, оскільки це неможливо без зіставлення всіх 503s до 429s.
— адамброд

Відповіді:


19

Хороші новини з версією 1.3.15 http://mailman.nginx.org/pipermail/nginx/2013-March/038306.html

у нас є директиви "limit_req_status" і "limit_conn_status". Я щойно тестував їх на Gentoo Linux (зауважте, що для цього потрібно зібрати модулі limit_req та limit_con).

За допомогою цих налаштувань я думаю, ви можете досягти того, про що ви просили:

limit_req_status 429;
limit_conn_status 429;

Я швидко це підтвердив:

ab2 -n 100000 -c 55 "http://127.0.0.1/api/v1

На якому більшість запитів не вдалося після активації директиви через високу швидкість запиту та налаштований ліміт у nginx:

limit_req zone=api burst=15 nodelay;

1
.. що таке "ab2"?
— XXL

1
abє інструментом від apache2-utils. для ubuntu це, abале під CentOs це ab2.
— дієта

1

На основі відповіді VBart та інших коментарів зрозуміло, що найкращим варіантом є зіставлення 503 помилок на 429s.

error_page 503 = 429 /too-many-requests.html

Оскільки nginx (1.3.x) використовує лише 503 коди статусу для limit_req та limit_conn, це повинен бути чудовим підходом.


це не найкращий варіант. 429 - конкретний випадок використання, відображення всіх потенційних 503 (сервіс недоступний) для повернення 429 є оманливим та недійсним для користувачів. Наприклад, клієнт може побачити номер 429 і використовувати логіку повторного повторного спроби, але якщо 503 не пов'язаний з дроселюванням, це не допоможе.
— Едді

0

Сам Nginx ніколи не повертає 503 у випадках, окрім limit_req та limit_conn.


1
Ах, це цікаво. Отже, ви говорите, що якщо я заміню 503 на 429, використовуючи error_page, я ніколи не скажу клієнтам занадто багато запитів, якщо вони дійсно не надсилають занадто багато запитів?
— адамброд

Так, правда, але лише за одним винятком, який ви не (proxy/factcgi/scgi/uwsgi)_intercept_errorsввімкнули. nginx.org/r/proxy_intercept_errors
— VBart

Можливо також, що додаток, що обслуговується nginx, поверне 503, що ускладнює клієнту можливість бачити, чи це обмеження підключення від nginx або помилка сервера від програми.
— bbaja42
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.