Назад | Перейти на главную страницу

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

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

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

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

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

Хорошие новости, с версией 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;

Основываясь на ответе VBart и других комментариях, ясно, что лучший вариант - сопоставить ошибки 503 с ошибками 429.

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

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

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