Как настроить 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.