новости
статьи
.sysadmin

используем Apache 2 и mod_cband для ограничения мирового трафика

Сформулируем задачу. Пусть у нас есть хостинг с неограниченным локальным трафиком и ограниченным мировым. Необходимо ограничить мировой трафик для каждого виртуального хоста до заданной величины.
Заходим на домашнюю страницу mod_cband и скачиваем дистрибутив. Для FreeBSD он есть в портах - /usr/ports/www/mod_cband.
Создаем каталог с правами на запись для веб сервера:

mkdir /usr/local/etc/apache2/Cband
chgrp www /usr/local/etc/apache2/Cband
chmod 664 /usr/local/etc/apache2/Cband


Вносим необходимые изменениея в httpd.conf:

...
ServerRoot /usr/local
LoadModule cband_module libexec/apache2/mod_cband.so
...
<IfModule mod_cband.c>
CBandDefaultExceededURL http://hosting.ua/bandwidth_exceeded.html
<CBandClass ua>
Include etc/apache2/cband-ua.conf
</CBandClass>
<CBandClass world>
CBandClassDst 0/0
</CBandClass>
<CBandUser hosting>
CBandUserClassLimit world 1Gi
CBandUserScoreboard etc/apache2/Cband/hosting.ua_scoreboard
CBandUserPeriodSlice 1H
CBandUserPeriod 1D
</CBandUser>
</IfModule>
...
<VirtualHost customer.hosting.ua:80>
...
<IfModule mod_cband.c>
CBandClassLimit world 100Mi
CBandUser hosting
CBandScoreboard etc/apache2/Cband/customer.hosting.ua_scoreboard
CBandPeriodSlice 1H
CBandPeriod 1D
</IfModule>
...
</VirtualHost>
...


пояснения

CBandDefaultExceededURL - страница, на которую будут редиректится запросы к хосту (серверу), выработавшему заданную квоту.
cband-ua.conf - файл, в который в нужном формате будут помещаться списки локальных сетей.

CBandUser hosting - пользователь "hosting" к которому мы привяжем лимит суммарного мирового трафика с сервера в 1GB - "CBandUserClassLimit world 1Gi"
CBandClassLimit world 100Mi - зададим лимит мирового трафика для конкретного виртуального хоста в 100 MB в сутки "CBandPeriod 1D".
(CBandUser|CBand)PeriodSlice 1H - сделаем так, чтобы нельзя было сразу выкачать весь суточный лимит, как для всего трафика с сервера, так и для отдельного виртуального хоста. При этом - лимит трафика для текущего часа получается делением суммарного оставшегося суточного трафика на оставшееся количество часов до истечения суток. Таким образом, неиспользованный трафик за предыдущие часы не теряется - очень рулезный и принципиальный момент.

Мы преднамеренно задали лимиты как для сервера, так и для виртуальных хостов. Дело в том, что реальный трафик для сервера обычно намного меньше суммы лимитов для всех виртуальных хостов. Ограничения для всего сервера заданы для случая, когда нам необходимо избежать превышения некоторого лимита, заданного нам провайдером, в случае внезапного возрастания активности большинства сайтов. В других случаях общий лимит можно не задавать.

На остальных настройках я останавливаться не буду - они хорошо описаны в официальной документации. Хочу лишь отметить, что дискретность подсчета трафика можно задавать и в неделях и в месяцах - кому как удобнее.

Теперь о том, как скармливать серверу список локальных хостов. Для этого пишем следующий скрипт:

#!/bin/sh
PATH=/sbin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
SRC=http://noc.ix.net.ua/ua-list.txt
NEW=`mktemp -t apache`
DIFF=`mktemp -t apache`
CONF=/usr/local/etc/apache2/cband-ua.conf
SHOW_MSG="YES"
if [ ! -z "${SHOW_MSG}" ];then
echo
echo 'Reload Apache UA Networks list:'
fi
echo 'CBandClassDst 10.0.0.0/8' > ${NEW}
echo 'CBandClassDst 192.168.0.0/16' >> ${NEW}
fetch -d -o - -q ${SRC} | egrep "^[0-9]" | \
awk -F'/' '{if($2){print $0}else{print $1"/24"}}' | sort | \
sed "s/^/CBandClassDst /" >> ${NEW}
diff -uBb ${CONF} ${NEW} | egrep '^[+-]CBandClassDst [0-9]' \
> ${DIFF}
if [ -s ${DIFF} ]; then
cp -f ${NEW} ${CONF}
chmod 644 ${CONF}
if [ ! -z "${SHOW_MSG}" ];then
echo
echo 'Apache Reconfigure:'
cat ${DIFF}
fi
apachectl graceful
fi
rm -f ${NEW} ${DIFF}


В список местных сетей добавлены сетки 10.0.0.0/8 и 192.168.0.0/16 - это может быть полезно для приравнивания трафика локалок к местному. Если закомментировать переменную "SHOW_MSG" - скрипт можно запускать из крона, при отсутствии ошибок в работе он не будет выводить ни каких сообщений.



Alexander Sheiko. При разработке скрипта использованы идеи товарища Bestia, за что ему отдельное спасибо.
обсудить статью
© сетевые решения
.
.