속도 제한시 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.