ngx_http_limit_req_module

ngx_http_limit_req_module 모듈(0.7.21)은 정의된 키 1개의 요청 처리 속도를 제한하는 데 사용합니다. 특히, 하나의 IP 주소에서 수신되는 요청의 처리 속도를 제한합니다. 이때 “leaky bucket” 메서드를 사용하여 제한합니다.

예제 구성

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    ...

    server {

        ...

        location /search/ {
            limit_req zone=one burst=5;
        }

Directives

Syntax:  limit_req zone=name [burst=number] [nodelay | delay=number];
Default: —
Context: http, server, location

공유 메모리 영역과 요청의 최대 버스트 용량을 설정합니다. 요청 속도가 영역에 구성된 속도를 초과할 경우, 처리를 지연하여 지정된 속도로 요청을 처리합니다. 초과된 요청은 요청 수가 최대 버스트 용량을 넘어설 때까지 지연되고, 이 경우 요청은 오류와 함께 종료됩니다. 기본적으로 최대 버스트 용량은 0과 같습니다. 예를 들어

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    location /search/ {
        limit_req zone=one burst=5;
    }

평균적으로 1초당 요청을 1개 이내로 제한하고 버스트는 요청 5개를 넘기지 않습니다.

요청이 제한되는 동안 초과되는 요청을 지연하는 것이 바람직하지 않은 경우, nodelay 매개변수를 사용해야 합니다.

limit_req zone=one burst=5 nodelay;

delay 매개변수(1.15.7)는 초과 요청이 제한되는 한도를 지정합니다. 기본값은 0입니다. 즉, 모든 초과 요청이 지연됩니다.

limit_req 명령은 여러 개일 수 있습니다. 예를 들어 다음의 구성은 하나의 IP 주소에서 수신되는 요청의 처리 속도를 제한하는 동시에, 가상 서버의 요청 처리 속도도 제한합니다.

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;

server {
    ...
    limit_req zone=perip burst=5 nodelay;
    limit_req zone=perserver burst=10;
}

이러한 명령은 현재 수준에서 limit_req 명령이 정의되지 않은 경우에만 이전 구성에서 상속합니다.

Syntax:  limit_req_dry_run on | off;
Default: limit_req_dry_run off;
Context: http, server, location
This directive appeared in version 1.17.1.

드라이 런 모드를 활성화합니다. 이 모드는 요청 처리 속도에 제한이 없습니다. 그러나 다른 경우와 마찬가지로 공유 메모리 영역에서 초과 요청 수를 반영합니다.

Syntax:  limit_req_log_level info | notice | warn | error;
Default: limit_req_log_level error;
Context: http, server, location
This directive appeared in version 0.8.18.

속도 초과로 인해 서버에서 요청 처리를 거부하거나 지연하는 경우에 원하는 로깅 수준을 설정합니다. 지연에 대한 로깅 수준은 요청 거부보다 한 단계 낮습니다. 예를 들어 “limit_req_log_level notice”를 지정할 경우, 지연은 info 수준으로 로깅됩니다.

Syntax:  limit_req_status code;
Default: limit_req_status 503;
Context: http, server, location
This directive appeared in version 1.3.15.

거부된 요청에 대한 응답에 반환할 상태 코드를 설정합니다.

Syntax:  limit_req_zone key zone=name:size rate=rate [sync];
Default: —
Context: http

여러 가지 키에 대해 상태를 저장할 공유 메모리 영역의 매개변수를 설정합니다. 특히, 상태는 현재 초과 요청 개수를 저장합니다. key에는 텍스트, 변수 및 그 두 가지 조합을 포함할 수 있습니다. 빈 키값이 포함된 요청은 반영하지 않습니다.

1.7.6버전 이전에는 key에 한 개의 변수만 포함할 수 있었습니다.

사용 예제:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

여기에서 상태는 10MB 영역 “1”에 저장되고, 이 영역의 평균 요청 처리 속도는 초당 요청 1개를 초과할 수 없습니다.

클라이언트 IP 주소가 키 역할을 합니다. $remote_addr 대신, 여기에서 $binary_remote_addr 변수를 사용합니다. $binary_remote_addr 변수 용량은 IPv4 주소의 경우 항상 4바이트이고, IPv6 주소의 경우 16바이트입니다. 저장된 상태는 항상 32비트 플랫폼에서 64바이트를 차지하고, 64비트 플랫폼에서 128바이트를 차지합니다. 1MB 영역은 64바이트 상태를 약 16,000개 저장할 수 있고, 128바이트 상태를 약 8,000개 저장할 수 있습니다.

영역 스토리지를 모두 사용하면 가장 오래전에 사용한 상태를 제거합니다. 그래도 새로운 상태를 생성할 수 없는 경우, 요청이 오류와 함께 종료됩니다.

1초당 요청에 지정된 속도(r/s)입니다. 초당 요청 1개 미만의 속도를 원하는 경우, 1분당 요청 수로 지정합니다(r/m). 예를 들어 1초당 요청 0.5개는 30r/m입니다.

sync 매개변수(1.15.3)는 공유 메모리 영역을 동기화합니다.

sync 매개변수는 상업용 구독에서 제공합니다.

또한, 상업용 구독에서는 1.17.7 이후로 이러한 각각의 공유 메모리 영역에 대한 상태 정보를 API를 사용하여 가져오거나 재설정할 수 있습니다.

임베디드 변수

$limit_req_status

요청 처리 속도 제한 결과 저장(1.17.6): PASSED, DELAYED, REJECTED, DELAYED_DRY_RUN 또는 REJECTED_DRY_RUN