Последний отсчет Дмитрий Докучаев 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, чтобы не затрагивать ненужные тебе домены, а затем попробуй запустить тулзу: |