Nginx의 rate limit 기능은 클라이언트가 특정 기간 동안 웹 서비스의 특정 부분(또는 전체)에 대해 수행할 수 있는 요청 수를 제어하는 방법입니다.
남용을 방지하고, 리소스를 보호하고, 웹 애플리케이션이나 API의 공정한 사용을 보장하는 데 특히 유용합니다.
Nginx의 속도 제한 기능에 대해 더 자세히 살펴보겠습니다.
# 1. 속도 제한을 위한 모듈
Nginx에는 속도 제한을 구현하는 몇 가지 모듈이 있습니다.
- limit_req 모듈 : HTTP 요청 속도 제한에 사용됩니다.
- limit_conn 모듈 : 키당 연결 수(예: IP 주소)를 제한하는 데 사용됩니다.
# 2. 주요 구성 요소
공유 메모리 영역
Nginx가 속도 제한 데이터를 추적하는 곳입니다. 요청 속도 제한의 경우 limit_req_zone을 사용하고 연결 속도 제한의 경우 limit_conn_zone을 사용하여 정의됩니다.
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;
$binary_remote_addr은 클라이언트의 IP 주소를 나타냅니다.
mylimit는 영역의 이름입니다.
'10m'은 해당 zone에 할당된 메모리 크기입니다.
rate=5r/s는 속도 제한을 초당 5개 요청으로 설정합니다.
속도 제한 지시문
특정 서버 또는 위치 컨텍스트에서 설정한 속도 제한을 적용하는 데 사용됩니다.
요청 속도 제한의 예:
location /api/ {
limit_req zone=mylimit burst=10;
}
burst=10은 한 번에 10개 이하의 요청을 일시적으로 버스트하는 것을 허용합니다. 이 버스트 내에서 더 많은 요청이 이루어지면 'nodelay'가 지정되지 않으면 지연됩니다.
# 3. 구성 가능한 옵션
버스트 및 지연
위에서 언급한 것처럼 '버스트' 매개변수는 빠르게 연속해서 처리할 수 있는 요청 수를 지정합니다. nodelay를 추가하면 속도와 버스트 크기를 초과하는 요청은 지연되지 않고 즉시 오류가 발생합니다.
사용자 정의 오류 코드
기본적으로 Nginx는 속도 제한 시 '503 서비스를 사용할 수 없음' 상태 코드를 보냅니다. limit_req_status 지시어를 사용하여 이를 수정할 수 있습니다.
다른 제한 키
많은 속도 제한이 클라이언트의 IP 주소($binary_remote_addr)를 키로 사용하는 반면, Nginx를 사용하면 특정 헤더나 쿠키와 같은 다른 값을 기반으로 속도 제한을 정의할 수 있습니다.
다중 속도 제한
다양한 속도 제한 영역을 설정하고 애플리케이션의 다양한 부분이나 다양한 클라이언트 유형에 여러 속도 제한을 적용할 수 있습니다.
# 4. 사용 사례
API 보호
클라이언트가 API 엔드포인트를 호출할 수 있는 빈도에 제한을 설정하여 남용을 방지합니다.
DOS 보호
클라이언트가 설정할 수 있는 요청 또는 연결 수를 제한하여 일부 형태의 서비스 거부 공격을 완화합니다.
리소스 관리
서버의 리소스가 과도하게 활동적인 몇몇 클라이언트에 의해 독점되지 않는지 확인하세요.
요약하자면, Nginx의 속도 제한 기능은 웹 리소스를 관리하고 보호하는 유연한 방법을 제공합니다. 이를 통해 클라이언트가 요청할 수 있는 빈도를 지정할 수 있으며 남용이나 잘못된 행동으로부터 보호하는 데 도움이 됩니다. 합법적인 트래픽을 방해하지 않고 목적을 달성하려면 적절한 구성과 조정이 필수적입니다.
'개발' 카테고리의 다른 글
공수 산정 (0) | 2024.07.12 |
---|---|
오래된 시스템 개선 (0) | 2024.04.30 |
Colima Docker DNS 오류 (0) | 2023.01.31 |
DDD START! 책 내용 정리 (0) | 2022.11.21 |
Dockerfile 에서 CMD, ENTRYPOINT 사용시 환경 변수 로딩 문제 (0) | 2022.01.14 |