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


이전에 NGINX 트래픽 관리 및 보안 제어 시리즈에서 웹 리소스에 대한 요청 속도를 제한하는 방법(클라이언트가 요청할 수 있는 속도 제한)에 대해 논의했습니다.

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

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

NGINX에서 대역폭 제한

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

limit_rate 20k;

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

limit_rate_after 500k;

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

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

server {
    listen 80;
    server_name testapp.tecmint.com;
    root /var/www/html/testapp.tecmint.com/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.tecmint.com;
    root /var/www/html/testapp.tecmint.com/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.tecmint.com;
    root /var/www/html/testapp.tecmint.com/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 트래픽 관리 및 보안 제어에 관한 더 많은 주제를 계속해서 다룰 것입니다. 그러나 평소와 같이 아래 피드백 양식을 통해 이 가이드에 대해 질문하거나 생각을 공유할 수 있습니다.

참조: NGINX 웹사이트의 보안 제어 가이드.