Последний отсчет

Дмитрий Докучаев aka Forb

Xakep, номер #052, стр. 052-068-4


Считаем трафик по WEB'y

Может возникнуть ситуация, когда ты держишь крупный хостинг, и необходимо считать трафик по каждому виртуальному хосту отдельно. Считать трафик по 80 порту - не выход из ситуации, так как весь web-трафик будет невозможно отсортировать по отдельным хостам. Возможны два решения этой несложной задачи:

1) Установить модуль для httpd, который будет брать данные "на лету".

2) Парсить access_log и осуществлять подсчет трафика.

Рассмотрим оба варианта, чтобы показать, что задача решается довольно просто. Конечно, лучше использовать перехват пакетов самим httpd, а точнее его модулем, а еще точнее mod_accounting =). Скачать его можно отсюда: http://easynews.dl.sourceforge.net/sourceforge/mod-acct/mod_accounting-0.5.tar.gz. Распаковываем и первым делом правим Makefile. Тебе нужно выбрать, какую БД использовать для хранения трафика: mysql или postgres. Я испытывал на mysql-базе, но, думаю, принципиальной разницы нет. Если у тебя тоже mysqld, удали флаг -DNEED_POSTGRES, установи -DNEED_MYSQL и укажи пути к бинарникам apachectl и axps. Затем убедись, что твой httpd был скомпилен с опцией --enable-module=so, позволяющей добавлять свои модули к httpd, что мы, собственно, и будем делать следующим шагом. Собери модуль, а затем обрати внимание на файл schema.sql. Это структура таблицы ipaccounting, состоящая из полей bytesin, bytesout и host, хранящих в себе значения входящих, исходящих байтов и виртуал хост соответственно. Отредактируй этот файл и вставь туда необходимые хосты. Затем выполни следующую последовательность действий:

[root@tema mod_accounting]# mysql -uroot -pmypasswd

mysql> create database ipaccounting;

Query OK, 1 row affected (0.00 sec)

mysql> \q

Bye

[root@tema mod_accounting]# mysql -uroot -pmypasswd ipaccounting < schema.sql

Тем самым ты создашь необходимую таблицу для работы модуля. Затем

редактируем httpd.conf и добавляем туда следующие директивы:

AccountingQueryFmt "UPDATE ipaccounting SET bytesin = bytesin + %r, bytesout = bytesout + %s WHERE LOWER( host ) = LOWER( '%h' )"

AccountingDatabase ipaccounting

AccountingDatabaseDriver mysql

AccountingDBHost localhost 3306

AccountingLoginInfo root mypasswd

Эти данные необходимо корректно задать для успешного соединения с mysql.

И финальным штрихом будет команда "apachectl restart". Если все работает как надо, посерфи хосты, занесенные в базу, чтобы оценить результат. А рабочий результат увенчается следующим ответом mysql:

Это означает, что ты все сделал правильно. Тебе осталось, опять же, сделать скрипт для dump'а результатов статистики, а это ты уже делал несколько раз =).

Для второго варианта, а именно парсинга (не путать с пирсингом :)) access_log'а апачи можно использовать отдельный софт, например, софтину httpdstats. Брать отсюда: http://www.charvolant.org/~Edoug/httpdstats/httpdstats-0.2.2.tar.gz. Для сборки особого ума не надо, конф тоже оформляется за 2 минуты. Пофикси опцию ignore_domains, чтобы не затрагивать ненужные тебе домены, а затем попробуй запустить тулзу:

Назад на стр. 052-068-3  Содержание  Вперед на стр. 052-068-5

Hosted by uCoz