NGINX에서 연결(요청) 속도를 제한하는 방법
NGINX 트래픽 관리 시리즈의 일부인 마지막 기사에서는 NGINX에서 연결 수를 제한하는 방법에 대해 논의했습니다. 이 가이드에서는 NGINX에서 요청 비율을 제한하는 방법을 살펴보겠습니다.
속도 제한은 클라이언트가 특정 기간 동안 수행할 수 있는 HTTP 요청 수를 제한하는 데 사용되는 트래픽 관리 기술입니다. 속도 제한은 초당 요청 수(또는 RPS).
요청의 예로는 애플리케이션 로그인 페이지에 대한 GET 요청, 로그인 양식 또는 POST에 대한 POST 요청이 있습니다. API 엔드포인트에서 Strong>을 실행합니다.
웹 애플리케이션이나 API 서비스에 대한 요청 속도를 제한하는 데에는 여러 가지 이유가 있습니다. 그 중 하나는 보안입니다. 즉, 악의적인 빠른 요청으로부터 보호하는 것입니다.
NGINX의 연결 속도 제한
limit_req_zone
지시문을 사용하여 속도 제한 매개변수를 정의하는 것부터 시작하세요. 필수 매개변수는 클라이언트를 식별하기 위한 키, 키 상태, 요청 제한 URL에 액세스한 빈도 및 속도를 저장하는 공유 메모리 영역입니다.
limit_req_zone
지시어는 HTTP 컨텍스트 내에서 유효합니다.
limit_req_zone $binary_remote_addr zone=limitreqsbyaddr:20m rate=10r/s;
또한 HTTP, 서버 및 위치 컨텍스트 내에서 유효한 limit_req_status
지시문을 사용하여 거부된 요청에 반환되는 응답 상태 코드를 설정합니다.
limit_req_status 429;
이제 limint_conn
지시문을 사용하여 HTTP, 서버 및 위치 컨텍스트 내에서 요청 속도 제한을 활성화할 수 있습니다. 메모리 영역을 매개변수로 사용하고 기타 선택적 매개변수도 사용합니다.
limit_req zone=limitreqsbyaddr;
다음 구성 예에서는 웹 애플리케이션 API에 대한 요청 속도를 제한하는 방법을 보여줍니다. 공유 메모리 크기는 20MB이고 요청 속도 제한은 초당 10개 요청입니다.
upstream api_service {
server 127.0.0.1:9051;
server 10.1.1.77:9052;
}
limit_req_zone $binary_remote_addr zone=limitreqsbyaddr:20m rate=10r/s;
limit_req_status 429;
server {
listen 80;
server_name testapp.linux-console.net;
root /var/www/html/testapp.linux-console.net/build;
index index.html;
#include snippets/error_pages.conf;
proxy_read_timeout 600;
proxy_connect_timeout 600;
proxy_send_timeout 600;
location / {
try_files $uri $uri/ /index.html =404 =403 =500;
}
location /api {
limit_req zone=limitreqsbyaddr;
proxy_pass http://api_service;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
구성 파일을 저장하고 닫습니다.
그런 다음 다음 명령을 사용하여 NGINX 구성 구문이 올바른지 확인하세요.
sudo nginx -t
그런 다음 NGINX 서비스를 다시 로드하여 최신 변경 사항을 적용합니다.
sudo systemctl reload nginx
/api/
에 액세스하는 단일 클라이언트에 의해 초당 10개 요청의 속도 제한이 초과되면 NGINX는 "429 요청이 너무 많습니다"를 반환합니다. 클라이언트에 오류가 발생했습니다.
또한 오류 로그에 사건을 기록합니다.
2022/04/29 00:30:38 [error] 3145846#0: *131039 limiting requests, excess: 0.990 by zone "limitreqsbyaddr", client: 192.168.1.10, server: testapp.linux-console.net, request: "GET /api/v1/app/meta-data HTTP/1.1", host: "testapp.linux-console.net", referrer: "https://testapp.linux-console.net/"
때로는 애플리케이션이나 API의 특성에 따라 클라이언트가 한 번에 많은 요청을 한 다음 더 많은 요청을 하기 전에 일정 기간 동안 요청 속도를 줄여야 할 수도 있습니다. NGINX는 또한 대기열의 초과 요청을 버퍼링하고 즉시 처리할 수 있습니다.
limit_req
지시문과 함께 burst
매개변수를 사용하여 속도 제한에서 이 동작을 활성화할 수 있습니다. 지연 없이 대기열을 활성화하려면 nodelay
매개변수를 추가하세요.
limit_req zone=limitreqsbyaddr burst=20 nodelay;
클라이언트의 IP를 기반으로 속도를 제한하는 문제가 있습니다. 특히 동일한 네트워크에서 애플리케이션에 액세스하고 NAT 뒤에서 작동하는 사용자의 경우 더욱 그렇습니다. 이 경우 모든 요청은 동일한 IP 주소에서 시작됩니다. 이러한 시나리오에서는 다른 변수를 사용하여 세션 쿠키와 같은 클라이언트를 식별할 수 있습니다.
요청 속도 제한에 대한 자세한 내용은 NGINX 웹사이트에서 NGINX 속도 제한을 확인하세요. 다음으로 NGINX에서 대역폭 사용량을 제한하는 방법을 다루겠습니다.