Как мне настроить nginx для выдачи 429 http кода при ограничении скорости?

11

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

К вашему сведению, я использую nginx в качестве обратного прокси-сервера с HttpLimitReqModule. Проект спецификации для кода состояния 429 - RFC6585 .

Этот (закрытый) вопрос о stackexcessed показывает, что можно использовать директиву error_page . Тем не менее, я не хочу возвращать 429, если действительно существует проблема с сервером (если клиент не слишком сильно нам мешает), и сервер должен вернуть 503 Сервис недоступен.

Какие-либо предложения?

adambrod
источник
К вашему сведению, я создал запрос на улучшение этой функции, поскольку это невозможно без сопоставления всех 503-х и 429-х.
Адамброд

Ответы:

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;
vanthome
источник
1
.. что такое "ab2"?
XXL
abэто инструмент от apache2-utils. на Ubuntu это есть, abно под CentOs это ab2.
Дитер
1

Исходя из ответа VBart и других комментариев, становится ясно, что наилучшим вариантом является сопоставление ошибок 503 и 429.

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

Так как nginx (1.3.x) использует только 503 кода состояния для limit_req и limit_conn, это должно быть хорошим подходом.

adambrod
источник
это не лучший вариант. 429 - это особый вариант использования, отображение всех потенциальных 503 (услуга недоступна) для возврата 429 вводит в заблуждение и недопустимо для пользователей. Например, клиент может увидеть 429 и использовать логику повторного отката, но если 503 не связан с регулированием, это не помогает.
Эдди
0

Сам Nginx никогда не возвращает 503 в случаях, отличных от limit_req и limit_conn.

VBart
источник
1
Ах, это интересно. Итак, вы говорите, что если я заменю 503 на 429 с использованием error_page, я никогда не буду сообщать клиентам слишком много запросов, если они действительно не отправляют слишком много запросов?
Адамброд
Да, правда, но с одним исключением, которое вы не (proxy/factcgi/scgi/uwsgi)_intercept_errorsвключили. nginx.org/r/proxy_intercept_errors
VBart
Также возможно, что приложение, обслуживаемое nginx, вернет 503, что усложнит клиенту возможность видеть, является ли оно пределом соединения из nginx или ошибкой сервера из приложения.
bbaja42