웹사이트 검색

NGINX 웹 서버에서 네트워크 대역폭을 제한하는 방법


이전에는 NGINX 트래픽 관리 및 보안 제어 시리즈에서 IP 주소와 같은 클라이언트 식별 매개변수를 사용하여 동일한 클라이언트가 웹 리소스에 대해 만들 수 있는 연결 수를 제한하는 방법에 대해 논의했습니다. 또한 웹 리소스에 대한 요청 속도를 제한하는 방법(클라이언트가 요청할 수 있는 속도 제한)도 다루었습니다.

단일 클라이언트로 인해 애플리케이션 사용 대역폭이 확장되지 않도록 하려면 클라이언트당 업로드 및 다운로드 속도를 제어해야 합니다. 이는 사이트 성능을 남용하려는 악의적인 사용자의 DoS(서비스 거부) 공격에 대한 일반적인 NGINX 보안 제어입니다.

시리즈의 세 번째 부분에서는 NGINX 웹 서버에서 네트워크 대역폭을 제한하는 방법을 설명합니다.

NGINX의 대역폭 제한

NGINX에서 대역폭을 제한하려면 클라이언트에 대한 응답 전송 속도를 제한하는 limit_rate 지시어를 사용하세요. 위치 내의 HTTP, 서버, 위치if 문에서 유효합니다. Strong> 블록이며 기본적으로 주어진 컨텍스트에 대한 속도 제한을 초당 바이트 수로 지정합니다. 메가바이트에는 m을, 기가바이트에는 g를 사용할 수도 있습니다.

limit_rate 20k;

또 다른 관련 지시어는 limit_rate_after로, 지정된 양의 데이터가 전송될 때까지 연결 속도가 제한되지 않도록 지정합니다. 이 지시문은 HTTP, 서버, 위치 및 "위치 블록 내의 if 문"에서 설정할 수 있습니다.

limit_rate_after 500k;

다음은 클라이언트가 초당 최대 20KB의 속도로 단일 연결을 통해 콘텐츠를 다운로드하도록 제한하는 구성 예입니다.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        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";

       
   }
   location /documents {
        limit_rate 20k;
        limit_rate_after 500k;  
}
}

위에서 설명한 필수 설정을 추가한 후 변경 사항을 저장하고 파일을 닫습니다. 그런 다음 다음과 같이 NGINX 구성 구문이 올바른지 확인하세요.

sudo nginx -t

모든 것이 정상이면 NGINX 서비스를 다시 로드하여 최신 변경 사항을 적용합니다.

sudo systemctl reload nginx

NGINX의 대역폭 및 연결 수 제한

위 구성을 사용하면 클라이언트는 여러 연결을 열어 대역폭을 늘릴 수 있습니다. 따라서 앞서 살펴본 것처럼 IP 주소와 같은 매개변수를 사용하여 클라이언트당 연결을 제한할 수도 있습니다.

예를 들어 IP 주소당 하나의 연결을 제한할 수 있습니다.

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;
limit_conn_status 429;

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        limit_conn   limitconnbyaddr  5;

        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";

       
   }
   location  /documents {
        limit_rate 50k;
        limit_rate_after 500k;  
        limit_conn   limitconnbyaddr  1;
}
}

NGINX에서 대역폭을 동적으로 제한

limit_rate 지시문에 대한 매개변수 값으로 대역폭을 동적으로 제한하는 변수를 지정할 수 있습니다. 특정 조건에 따라 속도를 제한해야 하는 상황에서 특히 유용합니다.

이 예에서는 지도 블록을 사용하고 있습니다. 이를 통해 첫 번째 매개변수에 지정된 하나 이상의 원래 변수($slow$limit_rate) 값에 따라 값이 달라지는 새 변수를 생성할 수 있었습니다.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

map $slow $limit_rate {
    1     20k;
    2     30k;
}

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        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";
   }
   location /documents {
        limit_rate $limit_rate;
        limit_rate_after 500k;
}
}

다음은 NGINX에서 대역폭의 동적 제한을 설명하는 또 다른 샘플 구성 예입니다. 이 구성을 사용하면 NGINX가 TLS 버전에 따라 대역폭을 제한할 수 있습니다. limit_rate_after 512 지시문은 헤더가 전송된 후의 제한 속도를 의미합니다.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

map $ssl_protocol $response_rate {
    "TLSv1.1" 50k;
    "TLSv1.2" 100k;
    "TLSv1.3" 500k;
}

server {
    listen 443 ssl;
    ssl_protocols       TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_certificate     /etc/ssl/testapp.crt;
    ssl_certificate_key   /etc/ssl/testapp.key;

    location / {
        limit_rate       $response_rate; # Limit bandwidth based on TLS version
        limit_rate_after 512;
        proxy_pass       http://api_service;
    }
}

이것이 시리즈의 이번 부분에서 여러분을 위해 준비한 전부입니다. 우리는 NGINX 트래픽 관리 및 보안 제어에 관한 더 많은 주제를 계속해서 다룰 것입니다. 그러나 평소와 마찬가지로 아래 피드백 양식을 통해 이 가이드에 대해 질문을 하거나 생각을 공유할 수 있습니다.