>  기사  >  운영 및 유지보수  >  Nginx가 http 리소스 요청을 제한하는 방법

Nginx가 http 리소스 요청을 제한하는 방법

王林
王林앞으로
2023-05-17 12:16:061025검색

전제 조건: nginx에는 ngx_http_limit_conn_module 및 ngx_http_limit_req_module 모듈이 있어야 합니다. 2>&1 nginx -v | tr ' ' 'n'|grep Limit 명령을 사용하여 해당 모듈이 있는지 확인할 수 있습니다. 그렇지 않은 경우 이를 다시 컴파일하고 설치하세요. 두 개의 모듈.

테스트 버전은 다음과 같습니다. nginx 버전은 1.15+

링크 수를 제한하세요

1.limit_conn_zone 지시문을 사용하여 키를 정의하고 공유 메모리 영역(작업자 프로세스)의 매개변수를 설정합니다. 이 영역을 사용하여 키 값 카운터를 공유합니다. 첫 번째 매개변수는 키로 평가할 표현식을 지정합니다. 두 번째 매개변수 zone은 영역의 이름과 크기를 지정합니다:

limit_conn_zone $binary_remote_addr zone=addr:10m;

2. 위치 {}, 서버 {} 또는 http {}의 컨텍스트에서limit_conn 지시어를 사용하여 제한을 적용합니다. 지역 이름 위의 두 번째 매개변수는 각 키에 허용되는 연결 수입니다.

location /download/ {
 limit_conn addr 1;
}

$binary_remote_addr 변수를 매개변수로 사용하는 경우 IP 주소 제한을 기반으로 합니다. 또한 $server_name 변수를 사용하여 연결을 제한할 수도 있습니다. 특정 서버에 대한 연결 수:

http {
 limit_conn_zone $server_name zone=servers:10m;

 server {
 limit_conn servers 1000;
 }
}

요청 속도 제한

속도 제한은 DDoS, CC 공격을 방지하거나 동시에 너무 많은 요청으로 업스트림 서버가 넘쳐나는 것을 방지하는 데 사용할 수 있습니다. 이 방법은 요청이 다양한 속도로 버킷에 도착하고 고정된 속도로 버킷을 떠나는 누출 버킷 알고리즘을 기반으로 합니다. 속도 제한을 사용하기 전에 "누수 버킷"의 전역 매개변수를 구성해야 합니다.

  • 키 - 한 클라이언트를 다른 클라이언트와 구별하는 데 사용되는 매개변수, 일반적으로 변수

  • 공유 메모리 영역 - 이러한 키를 보유합니다.

  • rate - 초당 요청(r/s) 또는 분당 요청(r/m)("누수 버킷 드레이닝") 요청에 지정된 키 상태 영역(예: "누수 버킷")의 이름 및 크기 비율 제한. 분당 요청은 초당 요청 1개 미만의 비율을 지정합니다.

이 매개변수는limit_req_zone 지시문을 사용하여 설정됩니다. 이 지시어는 http {} 수준에서 정의됩니다. 이 접근 방식을 사용하면 다양한 영역을 적용하고 다양한 컨텍스트에 오버플로 매개변수를 요청할 수 있습니다.

http {
 #...

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

이 구성을 사용하면 크기가 10m바이트이고 이름이 지정된 공유 메모리 영역이 생성됩니다. 이 영역은 $binary_remote_addr 변수를 사용하여 설정된 클라이언트 IP 주소의 상태를 보유합니다. $remote_addr에는 클라이언트의 IP 주소도 포함되어 있는 반면 $binary_remote_addr에는 IP 주소의 더 짧은 이진 표현이 포함되어 있습니다.

공유 메모리 영역의 최적 크기는 다음 데이터를 사용하여 계산할 수 있습니다. $binary_remote_addr ipv4 주소의 값 크기는 4바이트이고, 64비트 플랫폼의 저장소 상태는 128바이트를 차지합니다. 따라서 약 16000개의 IP 주소에 대한 상태 정보가 이 영역에서 1m바이트를 차지합니다.

nginx가 새 항목을 추가해야 할 때 저장 공간이 소진되면 가장 오래된 항목이 삭제됩니다. 해제된 공간이 여전히 새 레코드를 수용할 만큼 충분하지 않은 경우 nginx는 503 서비스 사용 불가 상태 코드를 반환하며, 이는limit_req_status 지시문을 사용하여 재정의할 수 있습니다.

이 영역이 설정되면 nginx 구성, 특히 서버 {}, 위치 {} 및 http {} 어디에서나limit_req 지시문을 사용하여 요청 속도를 제한할 수 있습니다. 컨텍스트:

http {
 #...

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

 server {
 #...

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

위 구성을 사용하면 nginx는 /에 있습니다. 검색 / 경로에서는 초당 1개 이상의 요청이 처리되지 않으며, 이러한 요청의 처리는 총 속도가 설정된 속도보다 크지 않도록 지연됩니다. nginx는 "버킷"(공유 버킷 1)이 가득 찰 때까지 이러한 요청 처리를 지연합니다. 전체 버킷에 대한 요청의 경우 nginx는 503 서비스 사용 불가 오류로 응답합니다(limit_req_status에 사용자 정의 세트 상태 코드가 없는 경우).

대역폭 제한

연결당 대역폭을 제한하려면 다음limit_rate 지시문을 사용하세요.

location /download/ {
 limit_rate 50k;
}

이 설정을 사용하면 클라이언트는 단일 연결을 통해 최대 50k/초의 속도로 콘텐츠를 다운로드할 수 있습니다. 그러나 클라이언트는 이 제한을 우회하기 위해 여러 연결을 열 수 있습니다. 따라서 지정된 값보다 빠른 다운로드 속도를 방지하는 것이 목표라면 연결 수도 제한해야 합니다. 예를 들어, IP 주소당 하나의 연결(위에 지정된 공유 메모리 영역을 사용하는 경우):

location /download/ {
 limit_conn addr 1;
 limit_rate 50k;
}

클라이언트가 특정 양의 데이터를 다운로드한 후에만 제한을 적용하려면limit_rate_after 지시어를 사용합니다. 클라이언트가 특정 양의 데이터(예: 파일 헤더 - 영화 인덱스)를 빠르게 다운로드하도록 허용하고 나머지 데이터가 다운로드되는 속도를 제한하는(사용자가 다운로드하는 대신 영화를 보도록 만드는 것) 것이 합리적일 수 있습니다.

limit_rate_after 500k;
limit_rate 20k;

다음 예는 연결 수와 대역폭을 제한하기 위한 결합 구성을 보여줍니다. 허용되는 최대 연결 수는 클라이언트 주소당 5개의 연결로 설정되어 있으며, 이는 최신 브라우저에서 일반적으로 한 번에 최대 3개의 연결이 열려 있기 때문에 가장 일반적인 경우에 적용됩니다. 동시에 다운로드를 위해 제공된 위치에서는 하나의 연결만 허용됩니다:

http {
 limit_conn_zone $binary_remote_address zone=addr:10m

 server {
 root /www/data;
 limit_conn addr 5;

 location / {
 }

 location /download/ {
  limit_conn addr 1;
  limit_rate_after 1m;
  limit_rate 50k;
 }
 }
}

위 내용은 Nginx가 http 리소스 요청을 제한하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제