Плагин Apache

Мониторинг производительности Apache HTTP Server с метриками в реальном времени по запросам, воркерам, трафику и нагрузке сервера.

Обзор

Плагин Apache собирает метрики производительности из модуля mod_status Apache, в том числе:

  • Статистика запросов — общее число запросов, запросов в секунду, общий трафик, время обработки
  • Статус воркеров — занятые воркеры, простаивающие воркеры
  • Метрики трафика — переданные байты, байты в секунду, байты на запрос
  • Использование CPU — пользовательское время, системное время, время дочерних процессов
  • Нагрузка системы — средняя нагрузка за 1/5/15 минут
  • Информация о сервере — uptime, версия Apache, модуль MPM

Требования

Версия Apache

  • Минимум: Apache 2.4
  • Рекомендуется: Apache 2.4.41 или новее
  • Протестировано с: Apache 2.4.41, 2.4.52, 2.4.54, 2.4.57

Модули Apache

Обязательно:

  • mod_status — модуль статуса сервера

Проверка включения:

# Ubuntu/Debian
apache2ctl -M | grep status

# CentOS/RHEL
httpctl -M | grep status

Включение, если отсутствует:

# Ubuntu/Debian
sudo a2enmod status
sudo systemctl restart apache2

# CentOS/RHEL
# mod_status is usually enabled by default

Зависимости Python

Дополнительные пакеты Python не требуются — используется стандартная библиотека urllib.

Конфигурация

Базовая конфигурация

plugins:
  apache:
    enabled: true
    status_url: http://127.0.0.1/server-status?auto

С пользовательским портом

plugins:
  apache:
    enabled: true
    status_url: http://127.0.0.1:8080/server-status?auto

С аутентификацией

plugins:
  apache:
    enabled: true
    status_url: http://127.0.0.1/server-status?auto
    username: monitor
    password: your-password

Все параметры конфигурации

plugins:
  apache:
    enabled: true                                      # Enable/disable plugin
    status_url: http://127.0.0.1/server-status?auto    # Status URL
    username: monitor                                  # HTTP auth username (optional)
    password: password                                 # HTTP auth password (optional)
    timeout: 10                                        # Request timeout (seconds)
    verify_ssl: true                                   # Verify SSL certificates

Переменные окружения

Конфигурацию можно переопределить с помощью переменных окружения:

export APACHE_STATUS_URL="http://127.0.0.1/server-status?auto"
export APACHE_USERNAME="monitor"
export APACHE_PASSWORD="password"

Настройка Apache

Настройка mod_status

Для Apache 2.4:

Создайте файл конфигурации:

sudo nano /etc/apache2/conf-available/status.conf

Добавьте конфигурацию:

<IfModule mod_status.c>
    <Location /server-status>
        SetHandler server-status
        Require local
        # Or allow specific IP
        # Require ip 127.0.0.1 ::1
    </Location>

    # Extended status provides detailed metrics
    ExtendedStatus On
</IfModule>

Включите конфигурацию:

# Ubuntu/Debian
sudo a2enconf status
sudo systemctl reload apache2

# CentOS/RHEL
# Include in /etc/httpd/conf.d/status.conf
sudo systemctl reload httpd

Альтернатива: Добавление в VirtualHost

<VirtualHost *:80>
    ServerName example.com

    <Location /server-status>
        SetHandler server-status
        Require local
    </Location>
</VirtualHost>

Конфигурация ExtendedStatus

Включите ExtendedStatus для подробных метрик:

# In apache2.conf or httpd.conf
ExtendedStatus On

Перезапустите Apache:

sudo systemctl restart apache2  # Ubuntu/Debian
sudo systemctl restart httpd    # CentOS/RHEL

Конфигурация безопасности

Ограничьте доступ только localhost:

<Location /server-status>
    SetHandler server-status
    Require local
</Location>

Разрешите конкретный IP-адрес:

<Location /server-status>
    SetHandler server-status
    Require ip 127.0.0.1 10.0.0.5
</Location>

С HTTP Basic-аутентификацией:

<Location /server-status>
    SetHandler server-status
    AuthType Basic
    AuthName "Server Status"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
</Location>

Создайте файл паролей:

sudo htpasswd -c /etc/apache2/.htpasswd monitor

Отключение логирования для эндпоинта статуса

Чтобы уменьшить шум в логах:

<Location /server-status>
    SetHandler server-status
    SetEnv dont-log 1
    Require local
</Location>

Или используйте директиву CustomLog:

CustomLog logs/access_log combined env=!dont-log

Собираемые метрики

Метрики запросов

Метрика Описание Единица Тип
total_accesses Всего запросов с момента запуска Количество Counter
total_kbytes Всего отданного трафика КБ Counter
total_duration Общее время обработки запросов Микросекунды Counter
req_per_sec Запросов в секунду req/s Gauge
bytes_per_sec Байтов в секунду B/s Gauge
bytes_per_req Среднее число байтов на запрос Байты Gauge

Метрики воркеров

Метрика Описание Единица Тип
busy_workers Занятые потоки/процессы воркеров Количество Gauge
idle_workers Простаивающие потоки/процессы воркеров Количество Gauge

Метрики CPU

Метрика Описание Единица Тип
cpu_user Пользовательское время CPU Секунды Gauge
cpu_system Системное время CPU Секунды Gauge
cpu_children_user Пользовательское время CPU (дочерние процессы) Секунды Gauge
cpu_children_system Системное время CPU (дочерние процессы) Секунды Gauge

Метрики сервера

Метрика Описание Единица Тип
uptime_seconds Uptime сервера Секунды Gauge
load1 Средняя нагрузка за 1 минуту Нагрузка Gauge
load5 Средняя нагрузка за 5 минут Нагрузка Gauge
load15 Средняя нагрузка за 15 минут Нагрузка Gauge
server_version Версия сервера Apache Строка Info
server_mpm Имя модуля MPM Apache Строка Info

Примечание: Плагин собирает только числовые метрики. Парсинг scoreboard (разбивка по состояниям воркеров) в настоящее время не реализован.

Метрики на дашборде

Дашборд StatusRadar отображает:

Карточка обзора

  • Requests/sec — текущая частота запросов
  • Busy Workers — число активных воркеров
  • System Load — средняя нагрузка сервера
  • Traffic — байтов в секунду

График частоты запросов

  • Запросов в секунду во времени
  • Трафик (байт/сек) во времени
  • Средний размер запроса

График статуса воркеров

  • Занятые против простаивающих воркеров
  • Утилизация пула воркеров
  • Оповещения о насыщении воркеров

График использования CPU

  • Пользовательское против системного времени CPU
  • Время CPU дочерних процессов
  • Общее потребление CPU

График нагрузки системы

  • Средняя нагрузка за 1, 5 и 15 минут
  • Тренды нагрузки во времени

Установка

Быстрая установка

PLUGINS='apache' \
TOKEN='your-agent-token' \
APACHE_STATUS_URL='http://127.0.0.1/server-status?auto' \
bash -c "$(curl -sL https://statusradar.dev/install-agent.sh)"

Установка на существующий агент

  1. Включите mod_status (см. «Настройка Apache» выше)

  2. Настройте агент:

    sudo nano /opt/statusradar/config/agent.yaml

    Добавьте:

    plugins:
      apache:
        enabled: true
        status_url: http://127.0.0.1/server-status?auto
  3. Перезапустите агент:

    sudo systemctl restart statusradar-agent
  4. Проверьте:

    sudo journalctl -u statusradar-agent -n 50 --no-pager | grep apache

    Ожидается:

    INFO: Plugin apache: Metrics collected successfully
    INFO: Plugin apache: Uptime 86400s, 1234.5 req/sec

Тестирование

Ручной тест плагина

cd /opt/statusradar
python3 plugins/apache_plugin.py

Ожидаемый вывод:

Plugin: apache
Enabled: True
Available: True

Collecting metrics...
{
  "total_accesses": 1234567,
  "total_kbytes": 5678912,
  "total_duration": 987654321,
  "uptime_seconds": 86400,
  "cpu_user": 1234.56,
  "cpu_system": 567.89,
  "cpu_children_user": 12.34,
  "cpu_children_system": 5.67,
  "busy_workers": 8,
  "idle_workers": 142,
  "load1": 0.52,
  "load5": 0.48,
  "load15": 0.45,
  "req_per_sec": 45.2,
  "bytes_per_sec": 123456,
  "bytes_per_req": 2731,
  "server_version": "Apache/2.4.52 (Ubuntu)",
  "server_mpm": "event"
}

Проверка эндпоинта статуса

# Check status endpoint is accessible
curl http://127.0.0.1/server-status?auto

# Expected output (partial):
# Total Accesses: 1234
# Total kBytes: 5678
# CPULoad: .123
# Uptime: 86400
# ReqPerSec: 45.2
# BytesPerSec: 123456
# BytesPerReq: 2731
# BusyWorkers: 8
# IdleWorkers: 142

Проверка ExtendedStatus

curl http://127.0.0.1/server-status

# Should show detailed scoreboard
# If you only see basic stats, ExtendedStatus is not enabled

Устранение неполадок

Плагин не собирает метрики

Проверка 1: Запущен ли Apache?

sudo systemctl status apache2  # Ubuntu/Debian
sudo systemctl status httpd    # CentOS/RHEL

Проверка 2: Включён ли mod_status?

apache2ctl -M | grep status
# Should show: status_module (shared)

Проверка 3: Доступен ли эндпоинт статуса?

curl http://127.0.0.1/server-status?auto

# If 404, mod_status is not configured
# If 403, IP restrictions are blocking access

Проверка 4: Проверьте логи агента

sudo journalctl -u statusradar-agent -n 100 --no-pager | grep apache

Распространённые ошибки

"404 Not Found"

Ошибка:

ERROR: Plugin apache: HTTP 404 - /server-status not found

Причины:

  1. mod_status не включён
  2. location статуса не настроен

Решение:

# Enable mod_status
sudo a2enmod status

# Create status configuration
sudo nano /etc/apache2/conf-available/status.conf

# Add:
<IfModule mod_status.c>
    <Location /server-status>
        SetHandler server-status
        Require local
    </Location>
    ExtendedStatus On
</IfModule>

# Enable and reload
sudo a2enconf status
sudo systemctl reload apache2

"403 Forbidden"

Ошибка:

ERROR: Plugin apache: HTTP 403 - Access forbidden

Причина: Ограничения по IP блокируют доступ

Решение:

<Location /server-status>
    SetHandler server-status
    Require local  # Allows 127.0.0.1 and ::1
    # Or explicitly allow agent IP:
    # Require ip 127.0.0.1 10.0.0.5
</Location>

"ExtendedStatus is disabled"

Предупреждение:

WARNING: Plugin apache: Limited metrics - ExtendedStatus is disabled

Причина: Директива ExtendedStatus не установлена

Решение:

# In apache2.conf or httpd.conf
ExtendedStatus On

Перезапустите Apache:

sudo systemctl restart apache2

"Connection refused"

Ошибка:

ERROR: Plugin apache: Connection refused

Причины:

  1. Неверный status_url
  2. Apache не запущен
  3. Файрвол блокирует соединения localhost

Решение:

# Check Apache is running
sudo systemctl status apache2

# Check port
sudo netstat -tlnp | grep apache2

# Test connection
curl -v http://127.0.0.1/server-status?auto

Влияние на производительность

На Apache

Минимальное влияние:

  • mod_status отдаёт предварительно рассчитанную статистику
  • Нет дополнительного логирования или обработки
  • Время отклика: < 1 мс

Бенчмарк:

  • Накладные расходы Apache: < 0.01% CPU
  • Нет измеримой деградации производительности
  • Безопасно для высоконагруженных production-серверов

На агент

Использование ресурсов:

  • Память: +5 МБ
  • CPU: +1% во время сбора
  • Сеть: +0.5 КБ за сбор

Время сбора: < 0.1 секунды

Сценарии использования

1. Мониторинг насыщения воркеров

Отслеживайте:

  • Занятые воркеры против общего числа
  • Процент утилизации пула воркеров
  • Доступность простаивающих воркеров

Оповещение при:

  • Занятых воркерах > 90% от общего числа
  • Отсутствии доступных простаивающих воркеров
  • Простаивающих воркерах < 5

2. Анализ частоты запросов

Отслеживайте:

  • Запросов в секунду
  • Тренды частоты запросов
  • Шаблоны трафика

Оповещение при:

  • Всплеске частоты запросов > 3× базового уровня
  • Резком падении запросов (сбой)

3. Мониторинг использования CPU

Отслеживайте:

  • Использование CPU Apache (user + system)
  • Время CPU дочерних процессов
  • Корреляцию времени CPU с запросами

Оповещение при:

  • Времени CPU, растущем быстрее, чем запросы
  • Высоком системном времени (узкое место ввода-вывода)

4. Анализ трафика

Отслеживайте:

  • Байтов в секунду
  • Байтов на запрос
  • Общий отданный трафик

Оповещение при:

  • Насыщении пропускной способности
  • Необычно крупных запросах
  • Всплеске трафика

5. Мониторинг нагрузки системы

Отслеживайте:

  • Среднюю нагрузку системы (1/5/15 мин)
  • Анализ трендов нагрузки
  • Корреляцию нагрузки с частотой запросов

Оповещение при:

  • Load1 > числа ядер CPU
  • Быстро растущем тренде нагрузки

Лучшие практики

1. Настройте параметры воркеров

Для MPM prefork:

<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      150
    MaxConnectionsPerChild   0
</IfModule>

Для MPM worker/event:

<IfModule mpm_worker_module>
    StartServers             2
    MinSpareThreads         25
    MaxSpareThreads         75
    ThreadLimit             64
    ThreadsPerChild         25
    MaxRequestWorkers      150
    MaxConnectionsPerChild   0
</IfModule>

Отслеживайте и корректируйте на основе соотношения занятых/простаивающих воркеров.

2. Включите ExtendedStatus

Всегда включайте для подробного мониторинга:

ExtendedStatus On

Накладные расходы незначительны.

3. Учитывайте выбор MPM

Prefork: Один процесс на соединение

  • Хорош для: модулей без потокобезопасности (mod_php)
  • Память: Выше (каждый процесс загружает модули)
  • Масштабируемость: Ниже

Worker/Event: Потоки + процессы

  • Хорош для: современных развёртываний
  • Память: Ниже (общие модули)
  • Масштабируемость: Выше

Event MPM (рекомендуется):

  • Лучшая производительность
  • Асинхронная обработка keep-alive
  • Минимальное потребление памяти

4. Установите подходящие лимиты

Расчёт MaxRequestWorkers:

MaxRequestWorkers = (Total RAM - OS - Other) / (Apache process size)

Example:
Total RAM: 4GB
Reserved: 1GB (OS + other services)
Apache process: 25MB
MaxRequestWorkers = 3072MB / 25MB ≈ 120

5. Отключите логирование статуса

Предотвратите шум в логах:

<Location /server-status>
    SetHandler server-status
    SetEnv dont-log 1
    Require local
</Location>

Руководство по MPM Apache

Проверка текущего MPM

# Ubuntu/Debian
apache2ctl -V | grep MPM

# CentOS/RHEL
httpd -V | grep MPM

Смена MPM (Ubuntu/Debian)

# Disable current MPM
sudo a2dismod mpm_prefork

# Enable new MPM
sudo a2enmod mpm_event

# Restart Apache
sudo systemctl restart apache2

Сравнение производительности MPM

MPM Память Конкурентность Потокобезопасность Лучше всего для
Prefork Высокая Низкая Нет mod_php, устаревшие приложения
Worker Средняя Средняя Да Общее назначение
Event Низкая Высокая Да Современные сайты, высокий трафик

Рекомендация: Используйте Event MPM для лучшей производительности, если только вам не нужны модули без потокобезопасности.

Настройка дашборда мониторинга

Ключевые метрики для отображения

Основные:

  1. Запросов в секунду
  2. Занятые воркеры / Всего воркеров
  3. Нагрузка системы (load1, load5, load15)

Дополнительные: 4. Байтов в секунду 5. Использование CPU (user + system) 6. Uptime

Настройка оповещений

Рекомендуемые пороги:

# High worker utilization
busy_workers / (busy_workers + idle_workers) > 0.9

# System overload
load1 > cpu_cores

# Request spike
req_per_sec > baseline × 3

# No idle workers
idle_workers < 5

# High CPU time
cpu_user + cpu_system > baseline × 2

Расширенная конфигурация

Несколько экземпляров Apache

Мониторинг нескольких экземпляров Apache:

plugins:
  apache_main:
    enabled: true
    status_url: http://127.0.0.1:80/server-status?auto

  apache_ssl:
    enabled: true
    status_url: https://127.0.0.1:443/server-status?auto
    verify_ssl: false  # If using self-signed cert

Обратный прокси за Nginx

Если Apache находится за прокси Nginx:

<Location /server-status>
    SetHandler server-status
    Require ip 127.0.0.1 10.0.0.5  # Allow nginx backend IP
</Location>

Docker-контейнер

Мониторинг Apache в Docker:

plugins:
  apache:
    enabled: true
    status_url: http://apache-container:80/server-status?auto

Или открывайте статус на другом порту:

Listen 8080
<VirtualHost *:8080>
    <Location /server-status>
        SetHandler server-status
        Require all granted
    </Location>
</VirtualHost>

Примеры конфигураций

Базовая production-конфигурация

plugins:
  apache:
    enabled: true
    status_url: http://127.0.0.1/server-status?auto

С SSL и аутентификацией

plugins:
  apache:
    enabled: true
    status_url: https://127.0.0.1/server-status?auto
    username: monitor
    password: ${APACHE_PASSWORD}
    verify_ssl: true

Пользовательский порт

plugins:
  apache:
    enabled: true
    status_url: http://127.0.0.1:8080/server-status?auto

Ограничения

Текущие ограничения

  1. Нет метрик по виртуальным хостам — только общесерверная статистика
  2. Нет парсинга scoreboard — разбивка по состояниям воркеров не собирается
  3. Нет метрик длительности запросов — используйте логи доступа для медленных запросов
  4. Нет метрик частоты ошибок — отслеживайте логи ошибок отдельно

Масштабируемость

Протестировано с:

  • Apache, обслуживающим 10 000+ req/sec
  • 500+ процессов воркеров
  • Трафиком в несколько ГБ/сек

Производительность:

  • Время отклика эндпоинта статуса постоянно независимо от нагрузки
  • Нет влияния на производительность Apache

Следующие шаги

On this page