Ключевые слова:mod_accounting, apache, log, traffic, web, mysql, (найти похожие документы)
From: webmechanics.ru
Date: Mon, 13 Apr 2006 18:21:07 +0000 (UTC)
Subject: Считаем трафик с mod_accounting
Оригинал: http://www.webmechanics.ru/blog/?page_id=15mod_accounting - это модуль веб-сервера Apache, позволяющий
считать входящий и исходящий трафик, генерируемый сайтами. Трафик у
нас (пока) платный, поэтому нам интересно знать, какие из сайтов,
размещенные на нашей машине, сколько трафика генерируют.
Для корректной работы mod_accounting необходимы веб-сервер Apache
(версии 1.3.х, модуль не работает с версией 2.0.х) и сервер БД MySQL
или PostgreSQL. Веб-сервер у вас наверняка уже есть (иначе зачем вам
считать трафик :) ?)... MySQL (если он еще не установлен) можно
утсановить стандартными средствами вашего дистрибутива (yum install
mysql* для Fedora Core).
Для установки модуля необходимо скачать с сайта проекта архив с
последней стабильной версией mod_accounting, разархивировать его во
временную папку и, при необходимости поправив Makefile, командой make
install установить модуль.
Разумеется, вы можете (и скорее всего это будет лучшим вариантом),
установить этот модуль из пакетов своего дистрибутива (yum install
mod_accounting для Fedora Core).
После установки модуля можно приступить к его конфигурированию.
Необходимо создать в MySQL базу данных для хранения статистики, и
пользователя, обслуживающего эту БД.
CREATE DATABASE mod_acc;
GRANT USAGE ON *.* TO 'mod_acc'@'localhost' IDENTIFIED BY 'password';
INSERT INTO mysql.db (Host, Db, User, Select_priv, Insert_priv,
Update_priv, Delete_priv, Create_priv, Drop_priv, Grant_priv,
References_priv, Index_priv, Alter_priv) VALUES ('localhost',
'mod_acc', 'mod_acc', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N', 'N', 'Y', 'Y');
FLUSH PRIVILEGES;
Этими командами мы создали БД mod_acc и пользвателя mod_acc с паролем
password для работы с этой БД.
Далее, создаем таблицы в БД mod_acc для хранения данных.
USE mod_accounting;
DROP TABLE IF EXISTS archive_traffic;
CREATE TABLE archive_traffic (
id int(8) NOT NULL auto_increment,
ts datetime default NULL,
inbound bigint(20) unsigned default '0',
outbound bigint(20) unsigned default '0',
host char(255) default NULL,
PRIMARY KEY (id),
KEY host (host)
) TYPE=MyISAM;
DROP TABLE IF EXISTS ipaccounting;
CREATE TABLE ipaccounting (
bytesin bigint(20) default '0',
bytesout bigint(20) default '0',
host varchar(255) default NULL
) TYPE=HEAP;
Первая таблица, archive_traffic, предназначена для архивирования
статистики, вторая - ipaccounting, для хранения текущей статистики.
Для загруженных серверов возможно имеет смысл задать тип БД HEAP для
хранения данных таблицы в оперативной памяти (это ускорит операции
обновления данных).
Теперь необходимо заполнить таблицу ipaccounting данными о хостах,
обслуживаемых вашим сервером Apache.
INSERT INTO ipaccounting (bytesin, bytesout, host) VALUES (0,0,myhost.ru);
INSERT INTO ipaccounting (bytesin, bytesout, host) VALUES (0,0,www.myhost.ru);
INSERT INTO ipaccounting (bytesin, bytesout, host) VALUES (0,0,wap.myhost.ru);
и т.д. Для каждого хоста имеет смысл добавить две записи с префиксом
www. и без него. Так ваша статистика будет более полной.
Теперь можно перейти к конфигурации Apache. Подключаем модуль:
LoadModule accounting_module modules/mod_accounting.so
AddModule mod_accounting.c
Настраиваем обновление статистики в таблице ipaccounting. Каждое
ображение к Aache будет генерировать запрос к MySQL следующего
содержания: "обновить статистику для хоста х, увеличить исходящие
байты на исходящие байты запроса, увеличить входящие байты на входящие
байты запроса".
AccountingQueryFmt "UPDATE ipaccounting SET bytesin = bytesin + %r,
bytesout = bytesout + %s WHERE LOWER( host ) = LOWER( `%h' )"
AccountingDatabase mod_acc
AccountingDatabaseDriver mysql
AccountingDBHost localhost 3306
AccountingLoginInfo mod_acc mod_acc
Перезапускаем Apache, заходим на любой из сайтов, обслуживаемых им (и
внесенных в таблицу ipaccounting), после этого смотрим, как изменились
данные в таблице ipaccounting нашей БД.
SELECT * FROM ipaccounting WHERE host = "myhost.ru"
MySQL должен вернуть что-то типа:
| bytesin | bytesout | host |
| 12 | 543 | myhost.ru |
Если значения bytesin и bytesout больше нуля - значит mod_accounting
работает.
Помимо подсчета статистики нас интересует ее анализ. Для того, чтобы
не создавать лишних затруднений модулю сбора статистики, мы
периодически экспортируем данные в таблицу archive_traffic, в которой
и производим анализ. Скрипт на PHP, отвечающий за экспорт статистики,
приведен ниже. Мы запускаем этот скрипт через cron раз в сутки.
< ?php
// подключаем файл соединения с БД
require_once('sitesuite.php');
// делаем выборку всех данных из таблицы текущей статистики
mysql_select_db($database_sitesuite, $sitesuite);
$query_wm_runtime = "SELECT * from ipaccounting";
$wm_runtime = mysql_query($query_wm_runtime, $sitesuite) or
die(mysql_error());
$row_wm_runtime = mysql_fetch_assoc($wm_runtime);
// архивируем данные для каждого хостав таблицу archive_traffic
do {
$inbound = $row_wm_runtime['bytesin'];;
$outbound = $row_wm_runtime['bytesout'];;
$host = $row_wm_runtime['host'];;
$sql = sprintf("INSERT INTO archive_traffic (ts, inbound, outbound, host) VALUES (NOW(), '%s', '%s', '%s')",
$inbound, $outbound, $host);
mysql_select_db($database_sitesuite, $sitesuite);
$do = mysql_query($sql, $sitesuite) or die(mysql_error());
} while ($row_wm_runtime = mysql_fetch_assoc($wm_runtime));
// обнуляем данные в таблице текущей статистики
$sql = "UPDATE ipaccounting SET bytesin = 0, bytesout = 0";
mysql_select_db($database_sitesuite, $sitesuite);
$do = mysql_query($sql, $sitesuite) or die(mysql_error());
mysql_free_result($wm_runtime);
?>
Теперь можно использовать данные в таблице archive_traffic для анализа
распределения трафика по хостам. А архиве вы найдете простой скрипт на
php, выводящий статистику по хостам за определенный период в виде
таблицы.
Сам модуль, php скрипты и схему БД вы можете скачать здесь.