Главная | Контакты



Главная > Программы > Apache

Модуль mod_bandwidth

Модуль mod_bandwidth
Сервер Apache 1.3.x
Домашняя страница: www.cohprog.com/mod_bandwidth.html

Установка mod_bandwidth

Предупреждение: Очень важно дать наименьший приоритет  mod_bandwidth по сравнению с другими модулями, для того чтобы они выполнили свою работу перед тем как документы будут отправлены клиенту. По этой причине важно следить эти шаги:

APACI установка

  • Скопируйте файл mod_bandwidth.c в каталог Apache.
  • Запустите ./configure с следующими директивами  --add-module=mod_bandwidth.c --permute-module=BEGIN:bandwidth
  • Откомпилируйте Apache.

 APXS установка

  • Откомпилируйте модуль:
    /path_to_apache/bin/apxs -c /path/mod_bandwidth.c -o /path_to_apache/libexec/mod_bandwidth.so
  • Дополните директивы в httpd.conf :
    LoadModule bandwidth_module libexec/mod_bandwidth.so
    AddModule mod_bandwidth.c

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

Ручная установка

  • Скопируйте файл mod_bandwidth.c в "src/modules/extra" каталога Apache.
  • Скопируйте  "src/Configuration.tmpl" в "src/Configuration"
  • Отредактируйте "src/Configuration" и добавьте вначале:
    AddModule modules/extra/mod_bandwidth.o
  • Запустите "./Configure"
  • Откомпилируйте Apache

Создайте необходимые директории и права "read/write/execute" для пользователя, под которым запущен Apache. По умолчанию, mod_bandwidth использует следующие директории, которые можно изменить в директиве BandWidthDataDir:

/tmp/apachebw
/tmp/apachebw/link
/tmp/apachebw/master

Если эти каталоге не существуют или не доступны, то модуль будет недоступен. В некоторых системах каталог /tmp очищается при загрузке, в этом случае измените BandWidthDataDir.

Конфигурационные директивы mod_bandwidth:

BandWidthDataDir
Syntax : BandWidthDataDir <directory>
Default : "/tmp/apachebw"
Context : server config

Установить корневой каталог для временных файлов mod_bandwidth. Не забудьте создать: <directory>/master и <directory>/link

BandWidthModule
Syntax : BandWidthModule <On|Off>
Default : Off
Context : per server config

Включить или выключить модуль. По умолчанию модуль отключен. Если вы устанавливаете ограничение пропускной способности внутри директивы VirtualHost, вам необходимо также "BandWidthModule On" внутри этого блока.  Если вы устанавливаете ограничение пропускной способности внутри директивы Directory (за пределами VirtualHost), вам необходимо указать только один раз "BandWidthModule On" за пределами любого VirtualHost или Directory блока.

BandWidthPulse
Syntax : BandWidthPulse <microseconds>
Default :
Context : per server config

Изменение алгоритма используемого для расчета пропускной способности и передачи данных. В нормальном режиме (старый режим), модуль пытается передавать данные пакетами 1KB. Это означает, что если пропускная способность равна 512B, то модуль передаст 1KB, подождет 2 секунды, передаст следующие 1KB и т.д.

Установка значения "BandWidthPulse", будет изменять изменять алгоритм так, что сервер всегда будет ждать тоже время между передачей пакета, но размер пакета будет изменяться. Значение задается в миллисекундах. Например, если установить "BandWidthPulse 1000000" (1 сек) и ширина канала 512B, то сервер передаст 512B, подождет 1 секунду, передаст 512B и т.д.

Преимуществом является равномерность потока данных, недостатком есть большие накладные расходы передачи данных для заголовка пакета. Установка слишком малых значений (до 1/5 сек) не очень полезно и будет больше загружать систему и генерировать больше трафика.

Directory / VirtualServer директивы

BandWidth
Syntax : BandWidth <domain|ip|all> <rate>
Default : none
Context : per directory, .htaccess

Пропускная способность для файлов в этом каталоге и подкаталогах для удаленного хоста <domain> или <ip> адреса или всех <all> удаленных хостов.  IP адреса могут задаваться в формате 192.168.0.0/21. <rate> в Bytes/second. <rate>  "0" - без ограничений.

Несколько BandWidth limits могут быть установлены для одного и того же каталога и устанавливать различные пределы для различных хостов. В этом случае, важен порядок "BandWidth", модуль будет брать первую запись, которая удовлетворяет адресу клиента. Например,

<Directory /home/www>
BandWidth ecp.fr 0
BandWidth 138.195 0
BandWidth all 1024
</Directory>

Устанавливает ограничение для /home/www и всех поддиректорий равное 1024B/sec, кроме .ecp.fr и 138.195 - без ограничений.

LargeFileLimit
Syntax : LargeFileLimit <filesize> <rate>
Default : none
Context : per directory, .htaccess

Установить максимальный <rate> (in bytes/sec) для передачи файлов размера  <filesize> KBytes или больше. Несколько "LargeFileLimit" могут быть установлены для различных размеров.

<rate> "0" - нет никаких ограничений по размеру

<rate> "-1" - нет никаких ограничений для даного типа файлов. Это переписывает даже ограничение BandWidth. Может быть полезным для определения приоритета для маленьких файлов (html страницы, маленькие картинки).  Например,

If the following limits are set :
LargeFileLimit 200 3072
LargeFileLimit 1024 2048

Файлы меньше чем 200KBytes не ограничиваются. Файлы от 200KBytes (включая) до 1023Kbytes (включая) будут передаваться 3072Bytes/sec и файлы больше 1024Kbytes - 2048Bytes/sec. 

MaxConnection
Syntax : MaxConnection <connections>
Default : 0 (unlimited)
Context : per directory, .htaccess

Ограничить максимальное количество соединений. Если предел достигнут, новые соединения будут отклонены.Значение "0" - нет ограничений.

MinBandWidth
Syntax : MinBandWidth <domain|ip|all> <rate>
Default : all 256
Context : per directory, .htaccess

Установить минимальную пропускную способность передачи данных. This over-ride both BandWidth and LargeFileLimit rules as well as the calculated rate based on the number of connections.

Первый аргумент аналогичный BandWidth. <rate> в байтах за секунду. Значение "0" указывает использовать минимальное значение (256 Bytes/sec). 

Если BandWidth установлена "3072" (3KBytes/sec) и MinBandWidth равно "1024" (1KBytes/sec) то :

  • если одно соединение, то скорость передачи будет равна 3072 Bytes/sec.
  • если два соединения, то скорость передачи каждого файла будет равна  1536 Bytes/sec.
  • если три или больше соединений, то скорость передачи каждого файла будет равна  1024 Bytes/sec. (Minimal of 1024 Bytes/sec).

Если MinBandWidth равно "-1", то :

  • если одно соединение, то скорость передачи будет равна 3072 Bytes/sec.
  • если два или больше соединений, то скорость передачи каждого файла будет равна  3072 Bytes/sec. (Minimal of 1024 Bytes/sec).

Дополнительные замечания:

  • Если оба "BandWidth" и "LargeFileLimit" определены, то выбирается наименьшее. (Но не меньше чем "MinBandWidth") .
  • Если есть два ограничения в VirtualServer и Directory, то приоритет отдается второму.
  • Если ограничение определено за пределами Directory или VirtualHost, то оно будет действовать по умолчанию на все виртуальные сервера.

Запуск Apache

Для корректного результата важно отсутствие мертвых линков в каталоге mod_bandwidth. Хорошая идея запустить "cleanlink.pl" для автоматической очистки этих линков.

Материал взят с сайта: http://www.httpd.kiev.ua/modules/apache-1.3/mod_bandwidth/


    Модуль mod_bandwidth для apache1.3.x для ограничения скорости скачивания контента. Основной недостаток - понимает только статический контент - динамика нагенерённая при помощи php пролетает мимо него. Масса настроек - позволяет очень широко поиграться скоростями по IP, имени домена... Пригодится если необходимо ограничить скорость скачивания с сайта файлов, музыки или другого статического хлама (линия обычно-то не резиновая :) - а народ наш халяву любит).
   Ставим из портов:

/usr/home/lissyara/>cd /usr/ports
/usr/ports/>make search name='mod_bandwidth'
Port:   mod_bandwidth-2.0.6

Path:   /usr/ports/www/mod_bandwidth
Info:   Bandwidth management module for the Apache webserver
Maint:  apache@FreeBSD.org
B-deps: apache-1.3.34_4 expat-2.0.0 perl-5.8.7_2
R-deps: apache-1.3.34_4 expat-2.0.0 perl-5.8.7_2
WWW:    http://www.cohprog.com/mod_bandwidth.html

/usr/ports/>cd /usr/ports/www/mod_bandwidth
/usr/ports/www/mod_bandwidth/>make && make install && make clean

После установки раскомментируем строчки с модулем в конфиге  /usr/local/etc/apache/httpd.conf
LoadModule bandwidth_module   libexec/apache/mod_bandwidth.so
AddModule mod_bandwidth.c

И добавляем туда же следующие строки:


<IfModule mod_bandwidth.c>
# Включен (On), или отключен модуль (Off)
BandWidthModule         On
# Директория для хранения временных файлов
BandWidthDataDir       /tmp/bandwith
# С какой периодичностью отдавать куски файла
# (Дело в том, что модуль не ограничивает скорость скачивания клиентом,
# он отдаёт данные кусками, на максимальной скорости, а между кусками
# ждёт некоторое время. Вот это время и фирурирует в этом параметре.
# время - в микросекундах! (надо заметить, что при числах меньше

# десяти тыщщ у меня ничё не работало...)
BandWidthPulse         10000
# Собственно скорость, с которой будет отдавать данные клиентам,
# тут же указываются клиенты
# анлим для локалки
BandWidth              192.168.        0

# анлим для моего домена, т.е. для посетителей,
# которых IP резольвится типа gate.lissyara.su ....
BandWidth              lissyara.su     0
# Скорость, в байт/секунду для всех остальных, - на
# самом деле 1кб/с - это жестоко... Надо больше...
BandWidth               all             1024

# В этом параметре указывается скорость с которой будут отдаваться
# большие файлы - тут же указывается и размер (надо заметить, что
# размер файлов указывается в килобайтах, а скорость в байтах/секунду)
# файл размером больше 100кб будет отдаваться со скоростью 2048 байт/с
LargeFileLimit         100             2048
# файл размером больше 500кб будет отдавать со скоростью 4кб/с
# т.е. при размере от 100 до 500 кб скорость

# будет 2кб - согласно предыдущей директиве
LargeFileLimit         500             4096
# Максимальное число коннектов - 0 анлим.
MaxConnection          100
# Минимальная скорость - пунктик напрямую взаимосвязан с
# парамером BandWidth - т.е. если поставить BandWidth 3кб/с, а
# MinBandWidth 1кб/с то один клиент будет получать все три кб/с

# если клиентов будет два - то получат по полтора кб/с а вот
# если их будет сотня, то каждый получит по килобайту - это то
# и указывается в MinBandWidth. Если поставить 0 - это будет
# дефолтовое значение 256 байт/с, а -1 - тогда будет отдавать
# каждому со cкоростью указанной в BandWidth
# Синтаксис такой же как и у BandWidth
MinBandWidth           lissyara.su     -1

MinBandWidth           all             512
</IfModule>

Конфиг для примера - чтоб было видно, что скорость зарубает - в реальной жизни, конечно, надо будет скорость поднять, иначе посетители уйдут, не дождавшись загрузки страницы... Затем создаём директорию временных файлов, и даём на неё права пользователю, от которого бегает apache:
/root/>mkdir /tmp/bandwith
/root/>chown www:wheel /tmp/bandwith

После чего перезапускаем апач:
/usr/local/etc/apache/>/usr/local/etc/rc.d/apache.sh restart
Stopping apache.
Waiting for PIDS: 6930.
Starting apache.
/usr/local/etc/apache/>

И меня ожидал облом - не работало.... Скорость какая была ткакая и есть. В httpd-access.log всё было нормально, а вот в /var/log/httpd-error.log сыпались ошибки:

[Fri Feb 3 11:54:00 2006] [error] (2)No such file or directory: mod_bandwidth : Can't create/access master file /tmp/bandwith/master/86:282631
[Fri Feb 3 11:54:00 2006] [error] (2)No such file or directory: mod_bandwidth : Can't create/access master file /tmp/bandwith/master/86:282631
[Fri Feb 3 11:54:00 2006] [error] (2)No such file or directory: mod_bandwidth : Can't create/access master file /tmp/bandwith/master/86:282631

Вот как... А по документации он должен был создать субдиректории сам... Ну и ладно - делаю все, которые он сам должен был сделать:
/usr/local/etc/apache/>mkdir -p /tmp/bandwith/master
/usr/local/etc/apache/>mkdir -p /tmp/bandwith/link
/usr/local/etc/apache/>chown -R www:wheel /tmp/bandwith

Снова перезапустил - забегало. Если когда-нить буду варезник разворачивать - пригодится :)



Материал взят с сайта: http://www.lissyara.su/?id=1135

Главная > Программы > Apache