웹사이트 검색

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에서 대역폭 사용량을 제한하는 방법을 다루겠습니다.