Alexander Sheiko Blog

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

Категория: Компьютерное
Отправлено: 09.06.2006 02:31, Отредактировано: 18.08.2013 04:27

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

Заходим на домашнюю страницу mod_cband и скачиваем дистрибутив. Для FreeBSD он есть в портах - /usr/ports/www/mod_cband.

https://adsh.org.ua/blog/upload/mod_cband_logo.png

Создаём каталог с правами на запись для веб сервера:

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=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin

# SRC=http://stat.terabit.net.ua/ua
SRC=http://noc.ix.net.ua/ua-list.txt

NEW=`mktemp -t cband`
NETS=`mktemp -t cband`
DIFF=`mktemp -t cband`
CONF=/usr/local/etc/apache2/cband-ua.conf

# DEBUG="YES"

if [ ! -z "${DEBUG}" ];then
############################# Debug Version ################################
echo
echo 'Reload Apache UA Networks list'
echo
echo 'fetch -d -o -' ${SRC}':'
fetch -d -o - ${SRC} | \
egrep "([0-9]{1,3}\.){3}[0-9]{1,3}" | \
sed 's/^[ \t]*//;s/[ \t]*$//' | \
awk -F'/' '{if($2){print $0}else{print $1"/24"}}' > ${NETS}
if [ -s ${NETS} ]; then
echo '10.0.0.0/8' >> ${NETS}
echo '192.168.0.0/16' >> ${NETS}
cat ${NETS} | aggregate -q | 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}
echo
echo 'Networks DIFF:'
cat ${DIFF}
echo
echo 'Apache Reconfigure:'
apachectl graceful
echo
echo 'Number of lines' ${CONF}':'
wc -l ${CONF}
else
echo
echo 'No actions: DIFF file is null'
echo
echo 'Number of lines' ${CONF}':'
wc -l ${CONF}
fi
else
echo
echo 'New networks list is null'
echo
echo 'Number of lines' ${CONF}':'
wc -l ${CONF}
fi
############################# Debug Version ################################
else
############################# Normal Version ###############################
fetch -d -o - -q ${SRC} | \
egrep "([0-9]{1,3}\.){3}[0-9]{1,3}" | \
sed 's/^[ \t]*//;s/[ \t]*$//' | \
awk -F'/' '{if($2){print $0}else{print $1"/24"}}' > ${NETS}
if [ -s ${NETS} ]; then
echo '10.0.0.0/8' >> ${NETS}
echo '192.168.0.0/16' >> ${NETS}
cat ${NETS} | aggregate -q | 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}
apachectl graceful
fi
else
echo
echo 'Reload Apache UA Networks list:'
echo
echo 'New networks list is null'
fi
############################# Normal Version ###############################
fi
rm -f ${NEW} ${NETS} ${DIFF}


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

Если закомментировать переменную "SHOW_MSG" - скрипт можно запускать из крона, при отсутствии ошибок в работе он не будет выводить ни каких сообщений.

При разработке скрипта использованы идеи товарища Bestia за что ему отдельное спасибо.

Дополнено 26.07.2006: текущая версия PHP сильно течёт - имейте в виду при использовании.

Дополнено 26.01.2013: поправлен скрипт, генерящий список украинских хостов.
Постоянная ссылка Комментарии (2)
09.06.2006 18:05
Совершенно верно. Просто у нас в локалке есть только две вышеуказанные сетки.
09.06.2006 09:02
Ну если уже вписывать fake'овые адреса в UA класс то надо не забыть про сеть 172.16.0.0/12
Powered by sBLOG XHTML 1.0 Strict PHP CSS
Локальное время: 01.10.2022 16:40 GMT+2
© 2005-2022 Alexander Sheiko