Как ограничить пропускную способность Apache на Windows для IP и отдельных файлов

В данной статье мы рассмотрим как управлять пропускной способностью веб-сервера, как ограничивать пропускную способность для IP или для определённого сайта (виртуального хоста). Для этого мы установим и настроим плагин mod_bw. Это ограничитель пропускной способности для Apache на Windows. Данный модуль позволяет настраивать скорость загрузки данных с сервера, причём настроить можно отдельно для каждого типа и размера файлов, установить ограничения на основе IP адреса, подсети и User Agent пользователя.

Файл данного плагина не входит в стандартный набор Apache, но команда apachelounge компилирует его для Windows. Перейдите на сайт https://www.apachelounge.com/download/, найдите и скачайте файл mod_bw:

Как включить mod_bw

Распакуйте архив и поместите файл mod_bw.so в папку modules, если вы устанавливали по этой инструкции, то это папка C:\Server\bin\Apache24\modules\.

Для включения этого модуля, добавьте в ваш конфигурационный файл httpd.conf (C:\Server\bin\Apache24\conf\httpd.conf) строку:

LoadModule bw_module modules/mod_bw.so

По умолчанию модуль отключён, чтобы она начал работать добавьте в конфигурационный файл также строку:

BandWidthModule On

Чтобы изменения вступали в силу, не забывайте при каждом изменении конфигурационного файла httpd.conf перезапускать веб-сервер!

c:\Server\bin\Apache24\bin\httpd.exe -k restart

Добавление файлов для обработки модулем

По умолчанию данный модуль ловит не все запросы, пример нормального использования:

AddOutputFilterByType MOD_BW text/html text/plain

То есть будут обрабатываться только текстовые и HTML файлы. Чтобы принудительно обрабатывать каждый запрос укажите следующую директиву:

ForceBandWidthModule On

Это важная настройка! Поскольку если вы не добавите определённый тип файлов для обработки, то они будут игнорироваться! Причём даже если тип файла явно указан в директории LargeFileLimit!

Ограничение скорости загрузки с сервера

Следующей директивой устанавливается пропускная способность:

BandWidth [ИСТОЧНИК] [БАЙТЫ/СЕКУНДУ]

Она принимает 2 параметра. ИСТОЧНИК — это источник подключений. Это может быть полный хост, часть домена, IP адрес, маска подсети, (например 192.168.0.0/24 или 192.168.0.0/255.255.255.0) или all, что означает любой источник. Второй параметр указывает общую скорость, доступную для ИСТОЧНИКА. Если скорость установлена на 0, значит без лимитов.

Примеры:

BandWidth localhost 10240
BandWidth 192.168.218.5 0

Порядок имеет значение — первые записи имеют приоритет.

Вы также можете ограничить пропускную способность для определённых User Agent:

BandWidth u:[User-Agent] [bytes/s]

User-Agent — это регулярное выражение, которые будет проверяться на совпадение с моделей браузера. Самый простой способ объяснить, это примеры:

BandWidth "u:^Mozilla/5(.*)" 10240
BandWidth "u:wget" 102400

Первое правило будет искать браузер, который идентифицирует себя как Mozilla/5(что-то ещё).

Второе правило совпадёт с браузером, который в качестве части своего пользовательского агента имеет «wget».

Минимальная гарантированная скорость

Установка минимальной ширины пропускного канала:

MinBandWidth [ИСТОЧНИК] [БАЙТЫ/СЕКУНДУ]

Она принимает 2 параметра. ИСТОЧНИК — это источник подключений. Это может быть полный хост, часть домена, IP адрес, маска подсети, (например 192.168.0.0/24 или 192.168.0.0/255.255.255.0) или all, что означает любой источник. Второй параметр указывает общую скорость, доступную для ИСТОЧНИКА. Если скорость установлена на 0, значит без лимитов.

Что это значит? Если у вас общая скорость 100 Кбайт, а MinBandWidth установлен на 50 Кбайт, не имеет значения, сколько у вас клиентов, у всех будет минимальная общая скорость загрузки 50 Кбайт. Если скорость равна 0, вы будете использовать минимальное значение по умолчанию (256 байт/с). Существует специальное значение -1. Это значение означает, что у каждого клиента будет максимальная скорость, определяемая директивой BandWidth. Смотрите примеры:

BandWidth all 102400
MinBandWidth all 50000

В приведённом выше примере будет установлена максимальная скорость 100kb для первого клиента. Если придёт больше клиентов, пропускная способность будет соответственно разделена, но у каждого будет по крайней мере 50kb (даже если у вас 50 клиентов)

BandWidth all 50000
MinBandWidth all -1

Этот пример делает так, что каждый имеет максимальную скорость 50kb.

Ограничение скорости скачивания с сервера файлов определённого вида и размера

Директива для ограничения пропускной способности для файлов определённого типа и/или размера:

LargeFileLimit [ТИП] [МИНИМАЛЬНЫЙ РАЗМЕР] [БАЙТЫ/СЕКУНДУ]

ТИП, последняя часть файла (расширение) или * для соответствия всем файлам. Вы можете использовать .tgz, чтобы соответствовать только tar-сжатым файлы, .avi для соответствия видеофайлам или * для соответствия всем. МИНИМАЛЬНЫЙ РАЗМЕР — это размер (в килобайтах) файла для сопоставления. Таким образом, вы можете включить правилодля огромных видеофайлов, которые создают нагрузку на пропускной канал.

Пример — разрешённая скорость для файлов указанного типа и размера.:

LargeFileLimit .avi 500 10240

Ограничит .avi файлы большего (или равного) размера 500kb на скорость скачивания 10kbytes/s

При этом не забудьте установить значение AddOutputFilterByType для обработки указанного типа файлов или используйте ForceBandWidthModule для принудительной обработки всех типов файлов:

ForceBandWidthModule On

Настройки LargeFileLimit для типов необрабатываемых файлов игнорируются!

Если вы хотите установить ограничение для всех типов файлов, то в качестве ТИП укажите * (звёздочку).

Размер пакетов

Директива для установки размера пакета:

BandWidthPacket [РАЗМЕР]

Вероятно, вам никогда не нужно менять это. По умолчанию 8192, что хорошо

практически для любой скорости. Пакет должен быть размером от 1024 до 131072. Небольшой пакет приведёт к снижению максимальной скорости, а мод будет использовать больше времени для разбития на пакеты. Если вы используете слишком большой размер, мод настроит его на более низкие скорости. Если вы используете мод в высокоскоростных сетях, то есть вы хотите установить ограничения в мегабитах/с, вам будет лучше использовать размеры пакетов 16384 или 32768.

Максимальное число подключений

Настройка максимального количества подключений:

MaxConnection [ИСТОЧНИК] [МАКСИМАЛЬНО]

Директива принимает 2 параметра. ИСТОЧНИК — это источник подключений. Это может быть полный хост, часть домена, IP адрес, маска подсети, (например 192.168.0.0/24 или 192.168.0.0/255.255.255.0) или all, что означает любой источник. Второй параметр — это максимальное количество соединений, разрешённых от источника. Любое соединение выше МАКСИМАЛЬНО, получит ошибку 503 Сервис временно недоступен

Есть подвох. Вам необходимо иметь ограничение BandWidth для того же источника.

Это не обязательно должен быть нижний предел. Но нужно что-то установить (неограниченно, не считается). Вы можете спросить, почему. Это потому, что в модуле используется одинаковое пространство памяти ограничения полосы пропускания для подсчёта соединений, поэтому получается сэкономить пространство памяти. Если вы не указали ширину BandWidth с тем же источником, MaxConnections будет игнорироваться.

Пример:

BandWidth all 102400000
MaxConnection all 20

Или:

BandWidth all 102400000
BandWidth 192.168.0.0/24 10240
MaxConnection all 20
MaxConnection 192.168.0.0/24 5

Для указания максимального количества подключений можно указать пользовательский агент. Если вы хотите сделать это:

MaxConnection u:[User-Agent] [МАКСИМАЛЬНО]

User-Agent — это регулярное выражение, которые будет проверяться на совпадение с моделей браузера. Самый простой способ объяснить, это примеры:

MaxConnection "u:^Mozilla/5(.*)" 5
MaxConnection "u:wget" 5

Первое правило будет искать браузер, который идентифицирует себя как Mozilla/5(что-то ещё).

Второе правило совпадёт с браузером, который в качестве части своего пользовательского агента имеет «wget».

Пожалуйста, помните, что каждая скорость будет зависеть в основном от вашего соединения. Вы не можете получить больше скорости, если у вас её нет.

Изменение кода ошибок

Настройка кода ошибки:

BandWidthError [ОШИБКА]

По умолчанию при достижении maxconnections мод выдаст HTTP код 503, то есть код HTTP_SERVICE_UNAVAILABLE. Некоторым пользователям раздражает сообщение об ошибке, и они не знают, почему. Вы можете использовать ErrorDocument, чтобы указать ошибку 503 на страницу, объясняющую, что вы находитесь под большой нагрузкой соединений, но иногда 503 выдаётся сервером по другим причинам. Таким образом, с помощью этой директивы вы можете установить код ошибки, который будет возвращаться при достижении MaxConnection. Вы можете использовать любой код ошибки от 300 до 599. Обратите внимание, что некоторые коды ошибок уже используются, поэтому перед использованием любого числа просмотрите список кодов (найдите коды ошибок http в google). При тестировании я использовал код ошибки 510, который ещё не назначен для других целей.

Страница статуса модуля

Модуль может отображать простую страницу статуса, показывающую статистику от работающего модуля. Статистика показывает точную информацию по использованию модуля для ограничения скорости передачи в данную секунд.

Чтобы это работала, вам нужно настроить обработчик на любой виртуальный хост. Можно установить под административном виртуальным хостом или настроить какие-нибудь политики, чтобы сделать его приватным.

Пример на локальном веб сервере, добавьте в конфигурационный файл строки:

<location /modbw>
          SetHandler modbw-handler
</location>

Теперь страница со статусом будет доступна по адресу http://127.0.0.1/modbw. Или вы можете загрузить статистику в формате CSV по адресу http://127.0.0.1/modbw?csv

Предоставляется следующая информация:

id   : 0                // Порядковый номер правила
name : work.ivn.cl,all  // Имя виртуального хоста, область видимости правила
lock : 0                // Используется ли сегмент памяти (0 = нет)
count: 0                // Количество пользователей, для которых сработало это правило
bw   : 0                // Пропускная способность, используемая в настоящее время правилом
bytes: 0                // Количество отправленных байт. Истинно только если count>0
hits : 0                // Число раз, кто-либо подключился с учётом этого правила.

Примеры

Ограничить каждого пользователя максимальной скоростью загрузки 10Kb/s на этот виртуальный хост:

<Virtualhost *>
  BandwidthModule On
  ForceBandWidthModule On
  Bandwidth all 10240
  MinBandwidth all -1
  Servername www.example.com
</Virtualhost>

Ограничить всех внутренних пользователей (LAN) на 1000 kb/s с минимальной скоростью 50kb/s, а для файлов больше чем 500kb на 50kb/s.

<Virtualhost *>
  BandwidthModule On
  ForceBandWidthModule On
  Bandwidth all 1024000
  MinBandwidth all 50000
  LargeFileLimit * 500 50000
  Servername www.example.com
</Virtualhost>

Ограничить файлы с расширениями avi и mpg на 20kb/s.

<Virtualhost *>
  BandwidthModule On
  ForceBandWidthModule On
  LargeFileLimit .avi 1 20000
  LargeFileLimit .mpg 1 20000
  Servername www.example.com
</Virtualhost>

«Правильный» способ использования указав фильтр по mime типу (для текста) на 5kb/s:

<Virtualhost *>
  BandwidthModule On
  AddOutputFilterByType MOD_BW text/html text/plain
  Bandwidth all 5000
  Servername www.example.com 
</Virtualhost>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

wp-puzzle.com logo