Ограничение скорости — это эффективный механизм защиты системы, который снижает потенциальное давление и риски путем контроля входного и выходного потока системы. Когда веб-сайт работает в среде общедоступной сети, система может столкнуться с риском перегрузки из-за обычного доступа пользователей, веб-сканеров, злонамеренных атак или внезапного большого трафика, что приводит к задержкам ответа или даже сбоям системы.
В ответ на эту ситуацию технология ограничения тока может эффективно управлять одновременными запросами и обеспечивать стабильную работу системы. Ограничивая часть запросов, например, ограничивая частые запросы с одного и того же IP-адреса, система может разумно распределять ресурсы и гарантировать, что сервер сможет правильно реагировать на другие запросы.
Nginx предоставляет два основных метода ограничения тока: один — ограничение тока: ставку,Другой Ограничить количество подключенийколичество。также,Nginx также поддерживает ограничение скорости загрузки и выгрузки.,Стабильность и безопасность системы дополнительно повышаются.
nginx из ngx_http_limit_req_module
Модуль реализует функцию ограничения скорости обработки запросов и использует алгоритм дырявого ведра (leaky Bucket). bucket algorithm)。
Этот алгоритм можно образно описать как ведро, в которое вода непрерывно поступает сверху и вытекает с постоянной скоростью снизу. Если количество воды в ведре превышает определенный предел, новая вода будет отклонена или выброшена.
При обработке сетевых запросов,Бочку можно рассматривать как поворот,Вода представляет собой запрос клиента. когда поступит запрос,Если в ведре еще достаточно места,Запрос будет принят и передан на обработку. но,Если очередь заполнена,Тогда новый запрос будет временно отклонен или отброшен.,Пока не будет достаточно места для приема новых запросов. Этот метод может эффективно контролировать скорость обработки запросов к серверу.,Предотвратите перегрузку сервера из-за слишком большого количества запросов.
nginx Есть два основныхиз Инструкции можно использовать Конфигурация Ограничение тока:limit_req_zone
и limit_req
。
Давайте посмотрим демо
limit_req_zone $binary_remote_addr zone=artisan:10m rate=2r/s;
server {
location / {
limit_req zone=artisan;
}
}
limit_req_zone используется для установки текущего ограничения и параметров области общей памяти.,Формат::limit_req_zone key zone rate
limit_req_zone
даnginxсерединаизинструкция,Используется для запроса ограничения тока и связанных с ним параметров для конфигурации.,В основном это объекты, ограничивающие ток, области общей памяти и максимальные скорости доступа.
поддаверноlimit_req_zone
Части инструкцииизпредставлять:
artisan:10m
представляет собой размер10M,Имяartisan
изобщая область памяти。nginxвстречасуществоватьэта областьсередина Записыватьпроситьиздоступ к информации,чтобы ограничить ток. Когда необходимо сохранить новые записи,nginx очистит старые записи в соответствии с определенными политиками,чтобы освободить место.1M Может хранить 16 000 IP Информация об адресах и доступе, ремесленник, вероятно, может хранить около 160 000 адресов. nginx Создать новую записьизкогда,Записи, которые не использовались в течение предыдущих 60 секунд, будут удалены.,Если пространство освобождено, новые записи не могут быть сохранены.,Будет возвращен код состояния 503из. По умолчанию возвращает 503,Если вы хотите изменить возвращаемое значение,Можно установить
limit_req_status
rate=2r/s
Указывает максимальную обработку в секунду2запросы。на самом деле,nginx отслеживает запросы с точностью до миллисекунды,Таким образом, эта установка фактически обрабатывает 1 запрос каждые 500 миллисекунд. Если скорость поступления запросов превышает этот предел,Так избыточноиззапрос возможенбудет отклонения или задержка обработки.Приведенный выше пример просто указывает зона=ремесленник, что указывает на использование artisanэта областьиз Конфигурация。Мы можем понять, что в настоящее время это ведро не хранит капель воды.изспособность,приезжатьдостигатьиз Ничего нельзя слить сразуиз Запросить всебудет отклонен。Если я отправлю 10 запросов за 1 секунду,Среди них первые 500 миллисекунд являются один раз.,9 раз через 500 миллисекунд,Тогда будут отвечать только первые 500 миллисекунд запроса и последние 500 миллисекунд первого запроса.,остальные Запросить всебудет отклонен。
limit_req_zone
инструкциядля установки Ограничение токаизпараметр,Но он сам по себе не применяет существующие ограничивающие правила. Чтобы действующие ограничивающие правила вступили в силу,Его также необходимо использовать в сочетании сlimit_req
инструкция,Воляlimit_req_zone
определениеиз Ограничение тока Региональное применениеприезжатьспецифическийизпроситьиметь дело ссередина。
limit_req
Это команда, используемая в nginx для применения правил ограничения тока запроса. Ее формат:
limit_req zone=name [burst=number] [nodelay];
Ниже приводится описание каждой части параметров:
limit_req_zone
инструкцияопределениеиз Ограничение токаобластьизимя。существовать Конфигурациясередина,использоватьzone=name
Волясоответствующийиз Ограничение тока Региональное применениеприезжатьтекущийизlimit_req
правилосередина。
burst
параметрназад,nginx позволит определенному количеству запросов превысить лимит,Пока не будет достигнуто установленное количество пакетных запросов. Например,burst=10
Указывает, что разрешена максимальная одновременная обработка.10превышает лимитизпросить。
nodelay
параметрназад,nginx немедленно отклонит запросы, превышающие лимит.,Вместо того, чтобы положить его в очередь, ожидая обработки. Этот режим уменьшает задержку,Однако некоторые запросы могут быть полностью отклонены.проходитьиспользоватьlimit_req
инструкция,Вы можете применить ранее определенную область ограничения тока для обработки конкретного запроса.,отивыполнитьвернопроситьиз Ограничение токаконтроль。
Действительно,Для ситуаций, когда возникает внезапное движение транспорта,Использование исключительно фиксированной ставки для ограничения запросов может привести к тому, что некоторые запросы будут полностью отклонены.,Вместо того, чтобы полностью использовать ресурсы сервера. Чтобы справиться с пиковым трафиком,Можетиспользовать burst
параметрразрешить определенное количествоколичествоизпросить Превышено значениеизпредел,Это может смягчить воздействие пакетного трафика на систему.,В то же время контроль ограничения потока запросов по-прежнему сохраняется.
Например, мы можем настроить limit_req
Команда из формата, добавить burst
Параметры достижения этой цели:
limit_req zone=name burst=20;
В этом примере, в дополнение к использованию ранее определенной области ограничения тока name
,возвращатьсянабор burst=20
,Указывает, что максимальное количество пакетных запросов, которые разрешено обрабатывать одновременно, равно 20. так,Когда поступает всплеск трафика,nginx сначала позволит определенному количеству запросов превысить установленную скорость.,Пока не будет достигнуто установленное максимальное количество пакетных запросов.,Далее продолжайте движение с заданной скоростью.
корректируя burst
параметр,Вы можете гибко запрашивать текущую стратегию ограничения в соответствии с реальной ситуацией.,Может справиться с внезапным трафиком,Это также может защитить ресурсы сервера от чрезмерного потребления.
Продолжая предыдущий пример:
limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;
server {
location / {
limit_req zone=test burst=5;
}
}
burst Указывает количество дополнительных запросов, которые могут быть обработаны после превышения установленной скорости доступа. когда rate=2r/s время с указанием каждые 500 мс Может обработать запрос。
При взрыве = 5, если одновременно поступает 10 запросов, nginx Первый запрос будет обработан. Среди оставшихся 9 запросов 5 будут размещены поочередно, а остальные 4 запроса будут напрямую отклонены.
Затем каждые 500 мс получайте запрос на обработку.,В настоящее время, если позже поступят дополнительные запросы,,Если количество запросов в свою очередь превышает 5,будет отклонен,Если оно меньше 5 из, то он будет добавлен в очередь на ожидание. Мы можем понять, что теперь в ведре может храниться 5 капель воды:
Конфигурация burst После этого, хотя все запросы, приходящие одновременно, не будут отклонены, вам все равно придется подождать 500мс. Одно время обработки помещено в корзину, пятый запрос должен ждать 500 мс. * Обработка занимает 4 секунды. Более длительное время ожидания означает потерю пользователя. Во многих случаях такое время ожидания неприемлемо. На этом этапе нам нужно добавить nodelay Параметры, и burst используются вместе.
limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;
server {
location / {
limit_req zone=test burst=5 nodelay;
}
}
nodelay Указывает на отсутствие задержки. настраивать nodelay назад,Первый поступивший запрос и последующий запрос будут обработаны немедленно.,Ожидания запросов не будет.
Следует отметить, что из,Хотя запросы очередисерединаиз5 были обработаны сразу,нодаочередьсерединаиз Позиция остается прежнейдав соответствии с500ms из скорости высвобождается из поворота. Следующие 4 запроса по-прежнему отклоняются, что не приведет к увеличению верхнего предела пропускной способности в долгосрочной перспективе. Верхний долгосрочный предел пропускной способности устанавливается пользователем. rate Решите из.
поэтому,Эти параметры необходимо устанавливать в соответствии с фактическими потребностями и нагрузкой на систему.,Для достижения наилучшей производительности и удобства использования.
проходитьиспользоватьnginxизngx_http_geo_module
иngx_http_map_module
модуль,Возможна настройка белого списка,То есть на некоторые IP-адреса не влияют ограничения трафика.,оти Отменить этиIPадресизпросить Ограничение токанастраивать。
Вот простой пример конфигурации:
geo $limit {
default 1; # По умолчанию все IP-адреса подвергаются регулированию.
10.0.0.1/32 0; # На IP-адреса в белом списке не влияют ограничения трафика
192.168.1.0/24 0;
}
map $limit $limit_key {
1 "";
0 $binary_remote_addr;
}
limit_req_zone $limit_key zone=artisan:10m rate=2r/s;
server {
location / {
limit_req zone=artisan burst=5 nodelay;
# другой Конфигурация... }
}
В этой конфигурации:
geo
блок используется для определения блока с именем $limit
изпеременная, переменная определяет, следует ли ограничивать влияние трафика на основе запроса изIP-адреса. По умолчанию регулирование затрагивает все IP-адреса, но IP-адреса в белом списке не затрагиваются.
limit_req_zone
Инструкции на основе $limit_key
переменная для определения области ограничения потока. IP-адреса в белом списке не будут затронуты ограничением трафика, поэтому они не будут помещены в зону ограничения трафика.
Через эту из Конфигурация,Можно отменить текущие настройки ограничения для IP-адресов в белом списке.,отисуществовать需要时верноидентификацияIPВыполните испытание давлением илидругойдействоватьи Нет受предел。
В этом примере конфигурации определены два правила. mylimit
и myLimit2
,соответственно для разныхиз Ограничение тока Стратегия。проходитьиспользовать geo
и map
модуль,Вы можете решить, будет ли на вас влиять ограничение трафика, в зависимости от источника запроса.,оти Реализовать функцию белого списка。
Конкретные детали заключаются в следующем:
geo $limit {
default 1; # По умолчанию все IP-адреса подвергаются регулированию.
10.0.0.0/8 0; # На IP-адреса в белом списке не влияют ограничения трафика
192.168.0.0/24 0;
}
map $limit $limit_key {
0 ""; # существовать На IP-адреса в белом списке не влияют ограничения трафика
1 $binary_remote_addr; # IP-адрес отсутствует в белом списке и использует двоичный удаленный адрес в качестве текущего ключа ограничивающей области.
}
limit_req_zone $limit_key zone=mylimit:10m rate=2r/s; # Определить области ограничения потока mylimit, ставка 2р/с
limit_req_zone $binary_remote_addr zone=myLimit2:10m rate=10r/s; # Определить области ограничения потока myLimit2, ставка 10р/сек.
server {
location ~* \.(html)$ {
limit_req zone=mylimit burst=5 nodelay; # Для IP-адресов, которых нет в белом списке, используйте mylimit правила, ограниченные 2r/s
limit_req zone=myLimit2 burst=5 nodelay; # Для всех IP-адресов, независимо от того, находятся они в белом списке или нет, используйте myLimit2 правила, ограниченные 10r/s
}
}
В этой конфигурации,Для IP-адресов в белом списке,потому что оно соответствуетприезжать Понятно myLimit2
правил, поэтому она ограничена 10р/с. IP-адреса, которых нет в белом списке, должны сопоставляться одновременно. mylimit
и myLimit2
Два правила, и самым строгим условием из двух является mylimit
из2r/s,поэтомубудет работать。
Этот метод позволяет гибко управлять текущим потоком запросов в различной степени в зависимости от источника запроса, чтобы удовлетворить потребности различных сценариев.
nginxизngx_http_limit_conn_module
модульпоставлять Понятно Ограничить количество подключенийиз Функция,в Содержит два ключаинструкция:limit_conn_zone
иlimit_conn
。этот两个инструкцияиз Форматы:limit_conn_zone key zone。
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
location ~* \.(html)$ {
limit_conn perip 10;
limit_conn perserver 100;
}
}
существовать Конфигурацияизserver
кусоксерединаизlocation
часть,проходитьlimit_conn
инструкция Воляидентификацияиз Количество соединенийпределправило应用приезжатьсоответствующийизпроситьиметь дело ссередина。Через эту из Конфигурация,Может эффективно контролировать количество подключений к конкретным объектам,Предотвратите чрезмерную нагрузку на сервер или снижение производительности из-за чрезмерных подключений.
limit_rate в основном используется для ограничения количества байтов, передаваемых между пользователями и серверами.,Обычно используется в таких сценариях, как ограничение скорости загрузки/отдачи. Эта функция не является отдельным модулем,идасуществоватьngx_http_core_module
модульсерединавыполнитьиз。Связанныйинструкциявключатьlimit_rateиlimit_rate_after
,Используется для контроля ограничения скорости согласно политике.
Команда limit_rate используется для установки ограничения скорости соединения. Установив директиву limit_rate в файле конфигурации.,и укажите, что вы хотите ограничить ставку,Вы можете контролировать скорость передачи данных по соединению. Эта ставка может быть фиксированным значением,Вы также можете динамически регулировать значение из по мере необходимости.
server {
location / {
limit_rate 4k;
}
}
Директива limit_rate_after используется для установки количества байтов в начальной части ответа, на которую не распространяются ограничения скорости. Обычно используется, чтобы ограничение скорости не влияло на передачу заголовков ответов или другой важной информации. После установки limit_rate_after политика ограничения скорости не начнет применяться до тех пор, пока не будет достигнуто указанное количество байтов.
server {
location / {
limit_rate_after 500k;
limit_rate 4k;
}
}
limit_rate_after
инструкцияпозволятьсуществовать传输Понятно一部分数据之назадснова ограничение скорости,Это может справиться с некоторыми конкретными сценариями.,Например, сегментированное ограничение скорости загрузки или контроль пропускной способности веб-сайта потокового видео.
Например,в конфигурации,еслинаборlimit_rate_after 500k
,Это означает, что политика ограничения скорости не будет активирована до тех пор, пока не будет передано 500 КБ данных. Это гарантирует, что на вас не повлияет ограничение скорости при запуске перевода.,Начальная скорость передачи гарантируется и после передачи определенного объема данных;,Затем ограничьте скорость по мере необходимости.,для контроля потребления полосы пропускания.
Эта конфигурация особенно полезна на веб-сайтах с сегментированным ограничением скорости загрузки или потоковым видео. на сайтах потокового видео,Чтобы обеспечить удобство использования,Обычно на первом экране ограничения скорости нет.,чтобы его можно было загрузить как можно быстрее. Подождите, пока пользователь не начнет смотреть видео,Затем ограничьте пропускную способность до разумного диапазона.,Это сделано для снижения дополнительных затрат, вызванных предварительной загрузкой слишком большого количества контента из-за слишком высокой скорости клиентской сети.
проходить Разумный Конфигурацияlimit_rate_after
инструкция,Можно добиться более гибкой стратегии ограничения скорости.,В то же время это обеспечивает лучший пользовательский опыт и эффективное использование сетевых ресурсов.
Суммируя,При разумной конфигурации эти две инструкции,Может реализовать контроль ограничения скорости по количеству байтов, передаваемых между пользователями и серверами.,тем самым защищая ресурсы сервера,Оптимизируйте пользовательский опыт.
proxy_limit_rate — это команда, используемая в Nginx для управления скоростью запросов, отправляемых на внутренний прокси-сервер. Когда Nginx действует как обратный прокси,Он может отправлять много запросов на внутренний сервер.,если не ограничено,Это может привести к перегрузке внутреннего сервера или потреблению ненужных ресурсов.
С помощью директивы proxy_limit_rate,Может ограничивать скорость запросов, отправляемых на внутренний сервер.,Чтобы предотвратить чрезмерную нагрузку на внутренний сервер. Это поможет вам сбалансировать нагрузку между обратными прокси-серверами и внутренними серверами.,Обеспечить стабильность и надежность системы.
Синтаксис proxy_limit_rateиз следующий:
proxy_limit_rate rate;
в,ставка — число, обозначающее ставку из,Это может быть число с единицей измерения,Например, 1к, 1м,Указывает объем данных, отправляемых в секунду.
Например,Если вы хотите ограничить скорость запросов к внутреннему серверу до 100 КБ в секунду,Это может быть так. Конфигурация:
proxy_limit_rate 100k;
Следует отметить, что из,Директива proxy_limit_rate применяется только к ситуациям обратного прокси HTTP и HTTPS.,Для других протоколов (таких как FastCGI и т. д.),Возможно, вам придется использовать разные инструкции для достижения аналогичных функций.
Основной принцип и использование proxy_limit_rate почти такие же, как и limit_rate, с той лишь разницей, что proxy_limit_rate ограничивает скорость соединения между внутренними серверами nginx, а limit_rate ограничивает скорость соединения между клиентами nginx. Следует отметить, что команда proxy_limit_rate должна быть включена, чтобы команда proxy_buffering вступила в силу.
#грамматика:
Синтаксис: скорость proxy_limit_rate;
По умолчанию: proxy_limit_rate 0;
Контекст: http, сервер, местоположение.
Эта директива появилась в версии 1.7.7.
кроме того,proxy_limit_rate ограничивает только скорость запросов, отправляемых на внутренний сервер.,Это не влияет на скорость ответов, полученных от внутреннего сервера. Если вам нужно ограничить скорость получения ответов,Этого можно добиться с помощью таких инструкций, как proxy_set_header и limit_rate_after.
Nginxизlimit_rate
инструкция Может与переменнаяиmap
инструкцияждатьобъединитьиспользовать,Тем самым реализуя функцию Динамическое ограничение скорости. Эта комбинация может динамически регулировать скорость отправки ответа на основе определенных атрибутов или условий запроса.,Делает ограничение скорости более гибким и интеллектуальным.
Приведите пример,Можетиспользоватьmap
инструкцияопределениеотображение,Сопоставьте запросы с различными значениями ограничения скорости на основе конкретных атрибутов запроса (таких как IP-адрес клиента, путь запроса и т. д.). Затем,Воляэтот映射结果作дляпеременнаяперешел кlimit_rate
инструкция,отивыполнить Динамическое ограничение скорости。
Вот простой пример, предполагающий, что вы хотите установить Динамическое ограничение скорости на основе запроса по пути:
map $request_uri $limit_rate {
default 1m; # Ограничение скорости по умолчанию составляет 1 МБ/с.
/images/ 500k; # Ограничение скорости для запросов по пути /images/ составляет 500 КБ/с.
/videos/ 2m; # Ограничение скорости для запросов по пути /videos/ составляет 2 МБ/с.
}
server {
...
location / {
limit_rate $limit_rate;
...
}
...
}
В этом примере,MapИнструкции на основе запроса изURI сопоставляют запросы с различными предельными значениями скорости,Однаконазад Воляэтот些限速值赋给переменнаяlimit_rate. В блоке сервера излокация Конфигурация используйте директиву limit_rate дляlimit_rateпеременная Применяется к настройкам ограничения скорости.,отивыполнить Понятно根据проситьпуть Динамическое ограничение скоростииз Функция。
таким образом,Вы можете выбирать в соответствии с различными потребностями и сценариями.,Гибкая настройка скорости отправки запросов,Для достижения лучшей производительности и использования ресурсов.
использоватьNginxизssi
модульсерединапоставлятьизвремяпеременнаяи регулярные выражения,объединитьmap
инструкцияи Настройка ограничения скорости,Реализуйте функцию динамической регулировки ограничения скорости в зависимости от разных периодов времени.
Предположим, мы хотим установить разные ограничения скорости днем и ночью, мы можем выполнить следующие шаги:
ssi
модульсерединапоставлятьиз$date_local
переменная获取текущий本地время。limit_rate
инструкция,выполнить Динамическое ограничение скорости。Вот простой пример конфигурации Nginx:
map $date_local $limit_rate {
~* "^\d{4}-\d{2}-\d{2} 0[8-1]\d:\d{2}:\d{2}" 1m; # С 8:00 до 13:00 установите ограничение скорости 1 МБ/с.
default 500k; # В другие периоды времени устанавливайте ограничение скорости на уровне 500 КБ/с.
}
server {
...
location / {
ssi on;
limit_rate $limit_rate;
...
}
...
}
В этом примере MapИнструкции на основетекущий本地времяdate_local для сопоставления регулярных выражений,Сопоставьте результаты сопоставления с различными значениями ограничения скорости. Если текущее время соответствует периоду времени между 8:00 и 13:00.,В противном случае ограничение скорости устанавливается на уровне 1 МБ/с;,Ограничение скорости по умолчанию составляет 500 КБ/с. Затем,Используйте эти значения ограничения скорости как переменную.limit_rateперешел кlimit_rateинструкция,выполнить Динамическое ограничение скорости。
Таким образом,Nginx может автоматически регулировать ограничение скорости в зависимости от текущего периода времени.,выполнить Понятно Динамическое ограничение скоростииз Функция。
Используйте команду Nginx «переменнаякарта» в сочетании с файлами cookie для достижения динамического ограничения скорости для разных пользователей. ты
первый,ужеопределение Понятно一个map
переменная$limit_rate_cookie
,В соответствии с разными значениями пользовательских файлов cookie они сопоставляются с разными значениями ограничения скорости. затем, Директива limit_rate используется для применения этой переменной к настройке ограничения скорости.
map $cookie_User $limit_rate_cookie {
gold 64k;
silver 32k;
copper 16k;
iron 8k;
}
server {
...
location / {
limit_rate $limit_rate_cookie;
...
}
...
}
В этом примере,Различные значения ограничения скорости сопоставляются в соответствии со значением файла cookie пользователя. Например,Если файл cookie пользователя содержит «User=gold»,Ограничение скорости составляет 64 КБ/с, если указано «User=silver»;,Ограничение скорости составляет 32 КБ/с.,И так далее.
Таким образом,Nginx будет динамически регулировать ограничение скорости в зависимости от значения файла cookie пользователя.,Реализованы персонализированные ограничения скорости для разных пользователей.