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