Консультация № 183239
19.05.2011, 11:57
50.29 руб.
0 3 1
Здравствуйте! У меня возникли сложности с таким вопросом:
У меня есть VDS, на нем находятся несколько моих сайтов.
Я планирую запустить еще один проект, но он будет давать достаточно большую нагрузку по трафику.
Мне нужно каким-то образом контролировать, не превышает ли суммарный трафик в данный момент, скажем, 10 Мбит/c
Если превышает – новому пользователю выдавать сообщение, что сервер перегружен.
Нужно именно программное решение. Возможно, поможет какой-либо из модулей Apache.
Ограничение требуется только на одном ресурсе, который может давать достаточно большой трафик.
Буду благодарен за подсказку, в какой направлении копать.

Обсуждение

Неизвестный
19.05.2011, 12:55
общий
19.05.2011, 12:58
Думаю, вот это будет полезно:
Управление трафиком в apache посредством модуля mod_cband
В статье "Manage Apache Download Speed And Traffic Limits With mod_cband" рассказывается об ограничении пропускной способности и числа одновременных соединений от одного посетителя или лимитирования объема трафика для одного виртуального хоста (например, 10 Гб в месяц), через использование модуля mod_cband для Apache2.

Например, нижеприведенные настройки ограничат скорость для виртуального хоста в 1024kbps, с возможностью обслуживания не больше 10 запросов в секунду и максимумом в 30 открытых коннектов. Каждый посетитель может установить не больше трех одновременных соединений и получить данные на скорости не выше 20kb/s . Кроме того, виртуальный хост может за 4 недели израсходовать не более 100 Мб трафика, если лимит будет превышен скорость будет ограничена в 128kbps.

<VirtualHost 1.2.3.4>
ServerName www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www
CBandLimit 100M
CBandExceededSpeed 128 5 15
CBandSpeed 1024 10 30
CBandRemoteSpeed 20kb/s 3 3
CBandScoreboard /var/www/scoreboard
CBandPeriod 4W
</VirtualHost>



Неизвестный
19.05.2011, 13:24
общий
Большое спасибо! Как раз то, что нужно!
Неизвестный
24.05.2011, 09:44
общий
это ответ
Здравствуйте, Finrod!
Думаю, следующие материалы будут полезны:

1. Управление трафиком в apache посредством модуля mod_cband
В статье "Manage Apache Download Speed And Traffic Limits With mod_cband" рассказывается об ограничении пропускной способности и числа одновременных соединений от одного посетителя или лимитирования объема трафика для одного виртуального хоста (например, 10 Гб в месяц), через использование модуля mod_cband для Apache2.

Например, нижеприведенные настройки ограничат скорость для виртуального хоста в 1024kbps, с возможностью обслуживания не больше 10 запросов в секунду и максимумом в 30 открытых коннектов. Каждый посетитель может установить не больше трех одновременных соединений и получить данные на скорости не выше 20kb/s . Кроме того, виртуальный хост может за 4 недели израсходовать не более 100 Мб трафика, если лимит будет превышен скорость будет ограничена в 128kbps.

<VirtualHost 1.2.3.4>
ServerName www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www
CBandLimit 100M
CBandExceededSpeed 128 5 15
CBandSpeed 1024 10 30
CBandRemoteSpeed 20kb/s 3 3
CBandScoreboard /var/www/scoreboard
CBandPeriod 4W
</VirtualHost>


2. mod_cband - накладываем ограничения на виртуальные хосты
Автор muff
Создано 2010-12-17 10:09
Опубликовано muff в Пт, 2010-12-17 10:09
mod_cband - служит для ограничения пропускной способности виртуального хоста, ограничения количества запросов и открытых соединения. Также есть возможность устанавливать ограничения на обьем переданной информации. После достижения лимита обьема можно либо блокировать доступ, либо изменить скорость доступа.

Ознакомиться со всеми возможностями модуля можно на странице проэкта [1].
Модуль явно используется хостерами, но и в частном случае может пригодится.

Итак, перейдем от слов к делу. Выполним установку модуля из системы портов:
# cd /usr/ports/www/mod_cband && make install clean && rehash
Установка прошла без проблем... Теперь пора разобраться как работает модуль.

Итак, единицы измерения, которые поддерживаются модулем.

Скорость передачи данных
kbps, Mbps, Gbps - множители бит/с. Соответственно 1024, 1024*1024 и 1024*1024*1024 бит/с.
kb/s, Mb/s, Gb/s - множители байт/с. Соответвенно 1024, 1024*1024 и 1024*1024*1024 байт/с.
По умолчанию - бит/с.

Квотирование
K, M, G - множители байт. Соответственно 1000, 1000*1000 and 1000*1000*1000 байт.
Ki, Mi, Gi - множители байт. Соответственно 1024, 1024*1024 and 1024*1024*1024 байт.
По умолчанию - K.

Временные периоды
S, M, H, D, W - множители секунд. Секунды, минуты, часы, дни и недели соответственно. 1, 60, 3600, 86400 и 604800 секунд.
По умолчанию - S.

mod_cband поддерживает следующие ключи.

Ключ: CBandDefaultExceededURL
Описание: URL по умолчанию, куда mod_cband должен перенаправить все запросы
к виртуальному хосту (или пользователю) после превышения квоты.
ПРИМЕЧАНИЕ: Если не указать URL, при достижении лимита будет отправлен код ответа
503 (Service Unavailable).
Синтаксис: CBandDefaultExceededURL URL
Пример: CBandDefaultExceededURL http://muff.kiev.ua/forbidden.html

Ключ: CBandDefaultExceededCode
Описание: HTTP-код, отправленный пользователю, когда квота будет превышена.
Синтаксис: CBandDefaultExceededCode HTTP_CODE
Пример: CBandDefaultExceededCode 509

Ключ: CBandScoreFlushPeriod
Описание: Период, по окончании которого счет для виртуалхоста или пользователя будет
записан в файл.
Синтаксис: CBandScoreFlushPeriod number_of_requests
Пример: CBandScoreFlushPeriod 100

Ключ: CBandSpeed
Описание: Указывает максимальную скорость для виртуалхоста.
Синтаксис: CBandSpeed kbps rps max_conn
kbps - максимальная скорость передачи
rps - максимальное количество запросов в секунду
max_conn - максимальное количество одновременных подключений
Пример: CBandSpeed 1024 10 30

Ключ: CBandRemoteSpeed
Описание: Указывает максимальную скорость для любого удаленного клиента.
Синтаксис: CBandRemoteSpeed kbps rps max_conn
kbps - максимальная скорость передачи
rps - максимальное количество запросов в секунду
max_conn - максимальное количество одновременных подключений
Пример: CBandRemoteSpeed 20kb/s 3 3

Ключ: CBandClassRemoteSpeed
Описание: Указывает максимальную скорость для любого удаленного клиента в зависимости
от значений класса.
Синтаксис: CBandClassRemoteSpeed class_name kbps rps max_conn
class_name - название определенного класа
kbps - максимальная скорость передачи
rps - максимальное количество запросов в секунду
max_conn - максимальное количество одновременных подключений
Пример: CBandClassDst 66.249.64/24
CBandClassDst 66.249.65/24
CBandClassDst 66.249.79/24
CBandClassRemoteSpeed googlebot_class 20kb/s 2 3

Ключ: CBandRandomPulse
Описание: Генератор случайных импульсов, является частью ограничителя скорости.
Синтаксис: CBandRandomPulse On / Off
Пример: CBandRemoteSpeed On

Ключ: CBandLimit
Описание: Задает квоту для виртуалхоста.
Синтаксис: CBandLimit limit
Лимит - доступные величины: K (kilo), M (mega), G (giga), Ki (kibi), Mi (mebi), Gi (gibi)
Пример: CBandLimit 10M
Задает квоту 10*1000*1000 байт
CBandLimit 10Mi
Задает квоту 10*1024*1024 байт

Ключ: CBandClassLimit
Описание: Задает квоту для виртуалхоста.
Синтаксис: CBandClassLimit class_name limit
class_name - название определенного класа
Лимит - доступные величины: K (kilo), M (mega), G (giga), Ki (kibi), Mi (mebi), Gi (gibi)

Ключ: CBandExceededURL
Описание: Задает URL, на который будут перенаправлены запросы, когда ограничения
будут превышены.
ПРИМЕЧАНИЕ: Если не указать URL, при достижении лимита будет отправлен код ответа
503 (Service Unavailable).
Синтаксис: CBandExceededURL URL
Пример: CBandExceededURL http://muff.kiev.ua/forbidden.html

Ключ: CBandExceededSpeed
Описание: Задает максимальную скорость, до которой mod_cband понизит скорость в случае
превышения квоты.
Синтаксис: CBandExceededSpeed kbps rps max_conn
kbps - максимальная скорость передачи
rps - максимальное количество запросов в секунду
max_conn - максимальное количество одновременных подключений

Ключ: CBandScoreboard
Описание: Задает scoreboard-файл для виртуалхоста.
Синтаксис: CBandScoreboard path
ПРИМЕЧАНИЕ: Файл должен быть доступен для записи пользователем, от имени которого работает
процесс Apache.

Ключ: CBandPeriod
Описание: Задает период, после которого счетчики ограничений обнуляются.
Синтаксис: CBandPeriod period
Пример: CBandPeriod 1W
CBandPeriod 60М

Ключ: CBandPeriodSlice
Описание: Задает длину части периода.
Синтаксис: CBandPeriodSlice slice_length
Пример: CBandLimit 100G
CBandPeriod 4W
CBandPeriodSlice 1W
Период будет разделен на 4 части (4W/1W = 4).
Для каждой части задано ограничение в 25G (100G/4=25G)

Ключ:
Описание: Задает имя cband-пользователя.
Синтаксис: user_name >

Ключ: CBandUserSpeed
Описание: Задает максимальную скорость для cband-пользователя.
Синтаксис: CBandUserSpeed kbps rps max_conn
kbps - максимальная скорость передачи
rps - максимальное количество запросов в секунду
max_conn - максимальное количество одновременных подключений
Пример: CBandUserSpeed 100kb/s 10 5

Ключ: CBandUserLimit
Описание: Задает квоту cband-пользователя.
Синтаксис: CBandUserLimit limit
Лимит - доступные величины: K (kilo), M (mega), G (giga), Ki (kibi), Mi (mebi), Gi (gibi)
Пример: CBandUserSpeed 10M
Задает квоту 10*1000*1000 байт
CBandUserSpeed 10Mi
Задает квоту 10*1024*1024 байт

Ключ: CBandUserClassLimit
Описание: Задает квоту cband-пользователя в зависимоти от класа назначения.
Синтаксис: CBandUserClassLimit class_name limit
class_name - название определенного класа
Лимит - доступные величины: K (kilo), M (mega), G (giga), Ki (kibi), Mi (mebi), Gi (gibi)

Ключ: CBandUserExceededURL
Описание: Задает URL, на который будут перенаправлены запросы, когда квота cband-пользователя
будет превышена.
Синтаксис: CBandUserExceededURL URL
ПРИМЕЧАНИЕ: Если не указать URL, при достижении лимита будет отправлен код ответа
503 (Service Unavailable).
Пример: CBandUserExceededURL http://muff.kiev.ua/forbidden.html

Ключ: CBandUserExceededSpeed
Описание: Задает максимальную скорость для cband-пользователя после превышения квоты.
Синтаксис: CBandUserExceededSpeed kbps rps max_conn
kbps - максимальная скорость передачи
rps - максимальное количество запросов в секунду
max_conn - максимальное количество одновременных подключений
Пример: CBandUserExceededSpeed 10kb/s 5 3

Ключ: CBandUserScoreboard
Описание: Задает scoreboard-файл для cband-пользователя.
Синтаксис: CBandUserScoreboard path
ПРИМЕЧАНИЕ: Файл должен быть доступен для записи пользователем, от имени которого работает
процесс Apache.

Ключ: CBandUserPeriod
Описание: Задает период, после которого счетчики ограничений cband-пользователя обнуляются.
Синтаксис: CBandUserPeriod period
Пример: CBandUserPeriod 1W
CBandUserPeriod 60М

Ключ: CBandUserPeriodSlice
Описание: Задает длину части периода для cband-пользователя.
Синтаксис: CBandUserPeriodSlice slice_length
Пример: CBandUserLimit 100G
CBandUserPeriod 4W
CBandUserPeriodSlice 1W
Период будет разделен на 4 части (4W/1W = 4).
Для каждой части задано ограничение в 25G (100G/4=25G)

Итак, попробуем ограничить ресурсы для определенного виртуального хоста. Чтобы упростить задачу, пусть на этом виртуальном хосте будет установлен Speedtest [2].

В конфигурационный файл виртуалхоста добавлены следующие переменные:

CBandSpeed 1024 10 30
CBandRemoteSpeed 256 4 4
CBandExceededURL http://muff.kiev.ua/ [3]
CBandLimit 15Mi
CBandPeriod 4W
CBandScoreboard /usr/local/etc/apache22/scoreboard/test.muff.kiev.ua.scoreboard

Создадим каталог, где будут храниться scoreboard-файлы и выставим необходимые права:

# mkdir /usr/local/etc/apache22/scoreboard
# chown -R www:www /usr/local/etc/apache22/scoreboard
Перезапускаем Apache, чтобы изменения вступили в силу:
# apachectl graceful

Проверяем, сработали ли ограничения по скорости:


Как видим, ограничения сработали только на исход (относительно сервера), а на вход ограничения не работают. Но, на мое мнение, это не так и страшно.
Поганял еще Speedtest, чтобы достигнуть квоты в 15 мегабайт. По достижению квоты, сработал ключ CBandExceededURL, соответственно был перенаправлен на указанный URL.

Все доступные возможности проверять не стал, остановился только на указанных.

Кстати, mod_cband также поддерживает возможность отображения статистики. Для активации даной возможности необходимо добавить в конфигурационный файл виртуалхоста следующий блок:
<Location /cband-status>
SetHandler cband-status
</Location>
<Location /cband-status-me>
SetHandler cband-status-me
</Location>


После внесения изменений необходимо перезапустить веб-сервер:
# apachectl graceful

Для просмотра статистики необходимо зайти по ссылке http://имя_виртуального_хоста/cband-status. Результат будет примерно следующий:


Основные вожможности модуля рассмотрели. Для более детального ознакомления советую ознакомиться с документацией [6], тем более что доступно множество примеров.

Форма ответа