Вопрос или проблема
Я ищу способ ограничить Nginx для местоположения по количеству запросов в секунду независимо от исходного IP. Насколько я понимаю, функция ограничения скорости чувствительна к IP, и ее нельзя отключить.
Каков правильный подход в этом случае?
Пример:
limit_req_zone global zone=global_limit:1k rate=50/s;
Часть global
– это ключ, который Nginx использует для группировки запросов. Установив его в статическую строку (это может быть что угодно), вместо переменной, все запросы будут попадать в одну и ту же группу.
Чтобы ограничить по IP, вы установите его в $binary_remote_addr
. Вы можете ограничивать скорость по практически любому параметру (см. https://www.nginx.com/blog/dynamic-bandwidth-limits-nginx-plus-key-value-store/#Complete-Sample-NGINX-Configuratio для сложного примера).
Ответ или решение
Чтобы ограничить количество запросов к Nginx до 50 в секунду независимо от IP-адреса, необходимо использовать механизм лимитирования запросов, который позволяет контролировать частоту запросов на уровне сервера. В данной ситуации решение заключается в использовании глобальной зоны с одинаковым именем, чтобы объединить все запросы в одну "ведро" для лимитирования.
Шаги для настройки Nginx
-
Открытие конфигурационного файла:
Первым делом, нужно открыть основной конфигурационный файл Nginx, который обычно располагается по пути/etc/nginx/nginx.conf
, или файл конфигурации вашего виртуального сервера (например,/etc/nginx/sites-available/default
). -
Определение зоны лимитирования:
Добавьте следующую строку в секциюhttp
вашего конфигурационного файла:limit_req_zone $binary_remote_addr zone=global_limit:1k rate=50r/s;
В этом случае
global_limit
– это имя зоны, а 50r/s указывает на желаемую скорость лимитирования запросов (50 запросов в секунду). Заметьте, что мы используем$binary_remote_addr
, который идентифицирует IP-адрес клиента, но это имя не повлияет на общий лимит. -
Применение лимита в вашем location-блоке:
Далее добавьте правило лимитирования в соответствующемlocation
блоке:location /your_path_here { limit_req zone=global_limit burst=10 nodelay; # другие директивы конфигурации }
Здесь
burst=10
указывает на то, что можно временно превышать лимит на 10 запросов;nodelay
позволяет немедленно выполнять запросы до выхода за пределы этого всплеска.
Пример полной конфигурации
http {
limit_req_zone $binary_remote_addr zone=global_limit:1k rate=50r/s;
server {
listen 80;
server_name your_domain.com;
location /your_path_here {
limit_req zone=global_limit burst=10 nodelay;
proxy_pass http://your_backend;
# другие директивы
}
}
}
Перезагрузка Nginx
После внесения изменений, вам нужно перезагрузить Nginx, чтобы они вступили в силу:
sudo systemctl restart nginx
Заключение
С помощью данной настройки Nginx будет ограничивать количество запросов до 50 в секунду для всех клиентов независимо от их IP-адресов. Это решение позволяет защитить ваш сервер от перегрузок и DDoS-атак, обеспечивая равномерное распределение ресурсов сервера. Убедитесь, что вы тестируете конфигурацию на собранном трафике, чтобы убедиться, что она соответствует вашим требованиям.
Рекомендуется также следить за логами Nginx для анализа производительности и корректности работы настроек лимитирования.