속도 제한시 429 http 코드를 반환하도록 nginx를 어떻게 구성합니까?


11

제한 / 속도 제한시 기본 503 (서비스를 사용할 수 없음) 대신 http 상태 코드 429 (너무 많은 요청)를 반환하도록 nginx를 어떻게 구성합니까?

참고로, HttpLimitReqModule과 함께 nginx를 리버스 프록시로 사용하고 있습니다. 429 상태 코드의 초안 스펙은 RFC6585 입니다.

stackexchanged 에서이 (닫힌) 질문error_page 지시문 을 사용할 수 있음을 보여줍니다 . 그러나, 나는 하지 않습니다 정말 서버 문제 (너무 많이 우리를 타격 고객)와 서버 사용할 수 없음 503 서비스를 반환해야한다이 경우 429을 반환합니다.

어떤 제안?


참고로,이 기능에 대한 개선 요청을 만들었습니다. 503을 429에 모두 매핑하지 않으면 불가능합니다.
adambrod

답변:


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. 우분투에서는 abCentO 아래에 ab2있습니다.
dieter

1

VBart의 답변과 기타 의견을 바탕으로 가장 좋은 옵션은 503 오류를 429로 매핑하는 것입니다.

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

nginx (1.3.x)는 limit_req 및 limit_conn에 대해 503 상태 코드 만 사용하므로이 방법을 사용하는 것이 좋습니다.


이것은 최선의 선택 이 아닙니다 . 429는 특정 사용 사례로, 모든 잠재적 503 (서비스를 사용할 수 없음)을 매핑하여 429를 반환하는 것은 오도의 소지가 있으며 사용자에게는 유효하지 않습니다. 예를 들어, 클라이언트는 429를보고 백 오프 재시도 로직을 사용할 수 있지만 503이 조절과 관련이없는 경우에는 도움이되지 않습니다.
Eddie

0

limit_req 및 limit_conn 이외의 경우 Nginx 자체는 503을 반환하지 않습니다.


1
아, 흥미 롭습니다. 따라서 error_page를 사용하여 503을 429로 바꾸면 고객이 너무 많은 요청을 보내지 않는 한 너무 많은 요청을 고객에게 알리지 않습니다.
adambrod 2016 년

그렇습니다. 단, 단 한 가지 예외는 있지만 (proxy/factcgi/scgi/uwsgi)_intercept_errors활성화 하지 않은 것 입니다. nginx.org/r/proxy_intercept_errors
VBart

nginx가 제공하는 앱이 503을 반환하여 클라이언트가 nginx의 연결 제한 또는 앱의 서버 오류인지 확인하기가 어려울 수도 있습니다.
bbaja42
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.