Поиск по сайту:

Как ограничить пропускную способность сети на веб-сервере NGINX


Ранее в нашей серии статей по управлению трафиком и контролю безопасности NGINX мы обсуждали, как ограничить количество подключений одного и того же клиента к вашим веб-ресурсам, используя параметры идентификации клиента, такие как IP-адрес. Мы также рассмотрели, как ограничить скорость запросов (ограничить скорость, с которой клиент может делать запросы) для ваших веб-ресурсов.

Чтобы гарантировать, что пропускная способность вашего приложения не будет расходоваться одним клиентом, вам необходимо контролировать скорость загрузки и скачивания для каждого клиента. Это стандартный элемент управления безопасностью NGINX против атак DoS (отказ в обслуживании) со стороны злоумышленников, которые просто пытаются злоупотребить производительностью сайта.

В этой третьей части серии мы объясним, как ограничить пропускную способность сети на веб-сервере 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.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 и контроля безопасности. Но, как обычно, вы можете задавать вопросы или делиться своими мыслями об этом руководстве через форму обратной связи ниже.