mod_status

Homepage: Apache Module mod_status

mod_status — это модуль, который генерирует специальную страницу с подробной информацией про веб-сервер, системные ресурсы, текущие запросы и скорость их обработки.

Если скрипты на ваших сайтах обрабатываются модулями вроде mod_php или mod_perl, то команды top и ps выведут только процессы httpd. В этом случае, проследить стандартными средствами системы, какой именно из скриптов потребляет системные ресурсы, уже невозможно. Этой информацией располагает только Apache, а администратор может её получить с помощью модуля mod_status.

mod_status предоставляет следующие сведения:

Выведем эту эту информацию по определенному адресу, обозначив для Location обработчик server-status.

# nano /etc/apache2/mods-available/status.conf

<IfModule mod_status.c>
ExtendedStatus On
<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from localhost ip6-localhost
#    Allow from .example.com
</Location>

</IfModule>

Если вы хотите собирать эту информацию для статистики или построить график, существует специальная версия страницы для использования в скриптах. Она доступна по адресу вида: http://example.com/server-status?refresh=2.

mod_status - скрипт сортирующей по IP клиента

PHP скрипт вытягивает get запросом данные mod_status и преобразует его в массив языка PHP. Далее эти данные сортируются по IP клиента при помощи пользовательской функции для uasort.

apache_status.php
<?php
$url = 'http://example.com/server-status';
$stat = file_get_contents($url);
 
// результат с тегами <table></table>. Весь шаблон.
preg_match('|<table(.*)</table>|Uis', $stat, $matches);
 
// получаем массив строк
preg_match_all('|<tr(.*?)</tr>|s', $matches[0], $matches);
 
$arr_td = array();
$arr_tr = array();
 
foreach ($matches[0] as $value) {
    preg_match_all('|<td.*?>(.*?)</td>|s', $value, $matches);
 
    foreach ($matches[0] as $v) {
        $arr_td[] = strip_tags($v);
    }
    if (!empty($arr_td)) {
        $arr_tr[] = $arr_td;
    }
 
    $arr_td = array();
}
 
function cmp($a, $b) {
    if ($a['10'] == $b['10']) {
        return 0;
    }
    return ($a['10'] < $b['10']) ? -1 : 1;
}
 
$data_tmp = array();
for ($i = 0; $i < 1000; $i++) {
    $data_tmp = $arr_tr;
    uasort($data_tmp, 'cmp');
}
?>
<table border="1">
    <thead>
        <tr>
            <th>0</th>
            <th>1</th>
            <th>2</th>
            <th>3</th>
            <th>4</th>
            <th>5</th>
            <th>6</th>
            <th>7</th>
            <th>8</th>
            <th>9</th>
            <th>10</th>
            <th>11</th>
            <th>12</th>
        </tr>
    </thead>
    <tbody>
        <?php
        foreach ($data_tmp as $value) {
            echo '<tr>';
            echo '<td>' . $value[0] . '</td>';
            echo '<td>' . $value[1] . '</td>';
            echo '<td>' . $value[2] . '</td>';
            echo '<td>' . $value[3] . '</td>';
            echo '<td>' . $value[4] . '</td>';
            echo '<td>' . $value[5] . '</td>';
            echo '<td>' . $value[6] . '</td>';
            echo '<td>' . $value[7] . '</td>';
            echo '<td>' . $value[8] . '</td>';
            echo '<td>' . $value[9] . '</td>';
            echo '<td>' . $value[10] . '</td>';
            echo '<td>' . $value[11] . '</td>';
            echo '<td>' . $value[12] . '</td>';
            echo '/<tr>';
        }
        ?>
    </tbody>
</table>