전제 조건: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!