Nginx 전류 제한을 구성하는 방법

PHPz
풀어 주다: 2023-06-02 13:10:06
앞으로
1990명이 탐색했습니다.

빈 버킷

가장 간단한 전류 제한 구성부터 시작합니다. 클라이언트 IP 전류 제한을 위한

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

server {
  location /login/ {
    limit_req zone=ip_limit;
    proxy_pass http://login_upstream;
  }
}
로그인 후 복사
  • $binary_remote_addr

  • zone=ip_limit:10m 현재 제한 규칙 이름은 ip_limit이며 허용됩니다. IP에 해당하는 현재 제한 상태를 기록하기 위한 10MB 메모리 공간

  • rate=10r/s 현재 제한 속도는 초당 10개 요청

  • location /login/ 로그인 흐름을 제한합니다

limit 스트리밍 속도는 초당 10개의 요청입니다. 10개의 요청이 유휴 nginx에 동시에 도착하면 모두 실행됩니까?

Nginx 전류 제한을 구성하는 방법

누수 버킷 누출 요청은 일정한 속도로 진행됩니다. 10r/s는 어떻게 일정한 속도인가요? 100ms마다 하나의 요청이 유출됩니다.

이 구성에서는 버킷이 비어 있으며 실시간으로 유출될 수 없는 요청은 모두 거부됩니다.

따라서 10개의 요청이 동시에 도착하면 한 개의 요청만 실행될 수 있고 나머지는 거부됩니다.

대부분의 비즈니스 시나리오에서는 이 10가지 요청이 실행될 수 있기를 바랍니다.

burst

이전 섹션의 문제를 해결하기 위해 구성을 변경해 보겠습니다

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

server {
  location /login/ {
    limit_req zone=ip_limit burst=12;
    proxy_pass http://login_upstream;
  }
}
로그인 후 복사

burst=12 Leaky Bucket의 크기는 12

Nginx 전류 제한을 구성하는 방법

논리적으로 Leaky Bucket이라고 하며, fifo 대기열로 구현되어 실행될 수 없는 요청을 일시적으로 캐시합니다.

누설 속도는 여전히 요청당 100ms이지만 동시에 발생하여 일시적으로 실행할 수 없는 요청을 먼저 캐시할 수 있습니다. 대기열이 가득 찬 경우에만 새 요청이 거부됩니다.

이렇게 새는 버킷은 흐름을 제한할 뿐만 아니라 피크 면도 및 계곡 채우기 역할도 합니다.

이러한 구성에서는 10개의 요청이 동시에 도착하면 100ms마다 하나씩 순차적으로 실행됩니다.

실행되었지만 대기열 실행으로 인해 지연이 크게 증가했으며 이는 여전히 많은 시나리오에서 허용되지 않습니다.

nodelay

너무 긴 지연으로 인한 지연 증가 문제를 해결하기 위해 계속 구성을 수정하세요.

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

server {
  location /login/ {
    limit_req zone=ip_limit burst=12 nodelay;
    proxy_pass http://login_upstream;
  }
}
로그인 후 복사

nodelay 예전에는 요청 실행 시작 시간을 앞당겨서 유출될 때까지 지연시켰습니다. 이제 지연이 없습니다. 버킷에 넣으면 즉시 실행되거나 현재 제한으로 인해 요청이 거부되지 않습니다.

요청은 일정한 속도로 버킷 밖으로 누출되고 버킷 공간은 고정되기 때문에 결국 초당 평균 5개의 요청이 실행되며 전류 제한의 목적은 여전히 ​​달성됩니다.

Nginx 전류 제한을 구성하는 방법하지만 이것도 단점이 있습니다. 현재 한도가 제한되어 있지만 그 한도가 그리 균일하지 않습니다. 위 구성을 예로 들면, 12개의 요청이 동시에 도착하면 이 12개의 요청은 즉시 실행될 수 있으며, 이후의 요청은 일정한 속도로만 버킷에 입력될 수 있으며 100ms마다 하나의 요청이 실행됩니다. . 일정 기간 동안 요청이 없고 버킷이 비어 있는 경우 12개의 동시 요청이 동시에 실행될 수 있습니다.

대부분의 경우 이러한 고르지 않은 전류 제한은 큰 문제가 되지 않습니다. 그러나 nginx는 nodelay 요청 수인 동시 실행을 제어하는 ​​매개변수도 제공합니다.

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

server {
  location /login/ {
    limit_req zone=ip_limit burst=12 delay=4;
    proxy_pass http://login_upstream;
  }
}
로그인 후 복사

delay=4는 버킷의 5번째 요청부터 지연을 시작합니다

이와 같이 지연 매개변수의 값을 조절하여 동시에 실행할 수 있는 요청 수를 조정하여 요청을 수행할 수 있습니다. 서비스에서는 여전히 일부 리소스를 제어해야 합니다.

위 내용은 Nginx 전류 제한을 구성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿