NGINX에서 연결(요청) 비율을 제한하는 방법
NGINX 트래픽 관리 시리즈의 일부인 마지막 기사에서 NGINX에서 연결 수를 제한하는 방법에 대해 논의했습니다. 이 가이드에서는 NGINX에서 요청 속도를 제한하는 방법을 살펴보겠습니다.
속도 제한은 클라이언트가 주어진 시간 동안 만들 수 있는 HTTP 요청 수를 제한하는 데 사용되는 트래픽 관리 기술입니다. 속도 제한은 초당 요청 수(또는 RPS)로 계산됩니다.
요청의 예로는 애플리케이션의 로그인 페이지에 대한 GET 요청, 로그인 양식의 POST 요청 또는 API 엔드포인트의 POST가 있습니다.
웹 애플리케이션 또는 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.tecmint.com; root /var/www/html/testapp.tecmint.com/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 Too Many requests\ 오류를 반환합니다.

또한 오류 로그에 인시던트를 기록합니다.
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.tecmint.com, request: "GET /api/v1/app/meta-data HTTP/1.1", host: "testapp.tecmint.com", referrer: "https://testapp.tecmint.com/"

때로는 애플리케이션이나 API의 특성에 따라 클라이언트가 한 번에 많은 요청을 한 다음 더 많이 만들기 전에 일정 기간 동안 속도를 줄여야 합니다. NGINX는 또한 대기열의 초과 요청을 버퍼링하고 즉시 처리할 수 있습니다.
limit_req
지시문과 함께 burst
매개변수를 사용하여 속도 제한에서 이 동작을 활성화할 수 있습니다. 지연 없이 대기열을 활성화하려면 nodelay
매개변수를 추가하십시오.
limit_req zone=limitreqsbyaddr burst=20 nodelay;
특히 동일한 네트워크에서 애플리케이션에 액세스하고 NAT 뒤에서 작동하는 사용자의 경우 클라이언트의 IP를 기반으로 하는 속도 제한이 있는 걸림돌이 있습니다. 이 경우 모든 요청은 동일한 IP 주소에서 시작됩니다. 이러한 시나리오에서는 다른 변수를 사용하여 세션 쿠키와 같은 클라이언트를 식별할 수 있습니다.
요청 속도 제한에 대한 자세한 내용은 NGINX 웹사이트에서 이 NGINX 속도 제한을 확인하십시오. 다음으로 NGINX에서 대역폭 사용을 제한하는 방법을 설명합니다.