Мониторинг Apache с помощью Zabbix

ARTICLES 24.10.22 24.10.22 142
Бесплатные курсына главную сниппетов

На сегодня Apache представляет собой одно из самых популярных ПО для создания Web-сервера. Среди достоинств Apache — доступность, гибкость настройки, модульная структура, позволяющая подключать необходимую функциональность, совместимость с различными платформами, языками программирования и базами данных, масштабируемость и огромное сообщество пользователей.

Очень часто Apache работает в паре с NGINX, об установке и мониторинге которого мы рассказывали в предыдущей статье. Вы также можете создать быстрый сайт вообще без Apache, используя только NGINX или другое высокопроизводительное решение.

Но если по тем или иным причинам ваши сайты работают на базе Apache, имеет смысл настроить мониторинг и при необходимости оптимизировать конфигурацию Apache. В этой статье мы расскажем о том, как установить Apache и настроить его мониторинг помощи Zabbix. Также приведем рекомендации по оптимизации памяти и повышения производительности.

Установка Apache в Debian

Если на вашем сервере установлена панель управления, такая как ISPmanager, Hestia Control Panel или другая, то, скорее всего, вместе с ней уже было установлено ПО Apache.

Это легко проверить при помощи следующей команды:

# systemctl status apache2

Когда Apache нет, вы увидите такое сообщение на консоли:

Unit apache2.service could not be found.

Если же Apache работает, на консоли появится информация о запущенном сервисе apache2.service:

● apache2.service - The Apache HTTP Server
    Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
    Active: active (running) since Mon 2022-10-03 12:20:35 MSK; 2h 34min ago
    Docs: https://httpd.apache.org/docs/2.4/
    Process: 3285064 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
    Main PID: 3285068 (apache2)
    Tasks: 55 (limit: 4676)
    Memory: 21.6M
    CPU: 660ms
    CGroup: /system.slice/apache2.service
    ├─3285068 /usr/sbin/apache2 -k start
    ├─3285069 /usr/sbin/apache2 -k start
    └─3285070 /usr/sbin/apache2 -k start

    Oct 03 12:20:35 zc621 systemd[1]: Starting The Apache HTTP Server...
    Oct 03 12:20:35 zc621 systemd[1]: Started The Apache HTTP Server.

Обратите внимание, что сервис apache2.service должен находиться в статусе active (running), а также enabled. В этом случае Apache будет запущен автоматически при перезагрузке сервера.

В том случае, когда на сервере с панелью управления не установлен Apache, то его нужно устанавливать при помощи панели. Если же панели нет, то ниже мы привели простую инструкцию:

# apt update
    # apt upgrade
    # apt install apache2

После установки нужно проверить состояние Apache командой «systemctl status apache2», убедившись, что сервис работает и будет автоматически перезапущен при перезагрузке ОС. Если это не так, введите такую команду:

# systemctl enable apache2

Возможно, вам придется устанавливать и подключать дополнительные модули, изменять используемый MPM. При необходимости воспользуйтесь полной инструкцией по установке Apache для разных ОС.

Установка шаблона 

Шаблон Apache by Zabbix agent не требует установки дополнительных скриптов — просто добавьте его для контролируемого узла с помощью веб-интерфейса Zabbix. Однако для использования этого шаблона к Apache необходимо подключить модуль status_module.

Описание данного шаблона можно найти в документации.

Подключение модуля status_module 

Прежде всего проверьте, подключен ли модуль status_module:

# apachectl -M | grep status_module
    status_module (shared)

Здесь команда «apachectl -M» выведет на консоль список всех подключенных модулей.

Если модуль не подключен, найдите и отредактируйте файл status.conf:

# ls /etc/apache2/mods-available | grep status.conf
    status.conf

В блоке /server-status укажите IP, для которого будет доступна статистика, как 127.0.0.1/32:

<IfModule mod_status.c>
    # Allow server status reports generated by mod_status,
    # with the URL of http://servername/server-status
    # Uncomment and change the "192.0.2.0/24" to allow access from other hosts.
    <Location /server-status>
    SetHandler server-status
    Require local
    Require ip 127.0.0.1/32
    </Location>

    # Keep track of extended status information for each request
    ExtendedStatus On

    # Determine if mod_status displays the first 63 characters of a request or
    # the last 63, assuming the request itself is greater than 63 chars.
    # Default: Off
    #SeeRequestTail On
    <IfModule mod_proxy.c>
    # Show Proxy LoadBalancer status in mod_status
    ProxyStatus On
    </IfModule>
    </IfModule>

После редактирования проверьте конфигурацию Apache. Если ошибок нет, подключите модуль status_module и перезапустите сервис:

# apachectl -t
    # a2enmod status
    # systemctl restart apache2
    # systemctl status apache2

Определение порта Apache

Когда на Web-сервере работает только Apache, и нет NGINX, то для Apache используется порт 80 (протокол HTTP) и 443 (протокол HTTPS). В иных конфигурациях Apache может занимать другие порты.

Чтобы определить, на каком порту запущен Apache, установите net-tools:

# apt install net-tools

После установки запустите утилиту netstat следующим образом:

# netstat -ltupan | grep apache2
    tcp6       0      0 :::81                   :::*                    LISTEN      3313854/apache2

В данном случае видно, что процесс apache2 занял порт 81.

Для определения порта, занятого процессом apache2, можно также использовать более современную и более «многословную» утилиту ss:

# ss -lpn | grep apache2
    tcp   LISTEN 0 511 *:81  *:* users:(("apache2",pid=3313856,fd=4), ("apache2",pid=3313855,fd=4),("apache2",pid=3313854,fd=4))

Порт Apache, который мы только что определили, потребуется нам позже при настройке макросов шаблона Apache by Zabbix agent.

Проверка модуля status_module

Итак, мы подключили модуль status_module, настроили конфигурацию Apache для получения от него информации о состоянии и узнали номер порта, на котором работает Apache.

Теперь в консоли сервера введите такую команду (здесь предполагается, что Apache работает на порту 8080):

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

В результате на консоли должна появиться детальная информация о состоянии сервиса Apache на момент ввода команды:

127.0.0.1
    ServerVersion: Apache/2.4.53 (Debian) mpm-itk/2.4.7-04 OpenSSL/1.1.1n
    ServerMPM: prefork
    Server Built: 2022-03-14T16:28:35
    CurrentTime: Tuesday, 04-Oct-2022 12:13:00 MSK
    RestartTime: Monday, 03-Oct-2022 12:24:15 MSK
    ParentServerConfigGeneration: 3
    ParentServerMPMGeneration: 2
    ServerUptimeSeconds: 85724
    ServerUptime: 23 hours 48 minutes 44 seconds
    Load1: 7.90
    Load5: 9.26
    Load15: 9.00
    Total Accesses: 802231
    Total kBytes: 15650007
    Total Duration: 2764899414
    CPUUser: 1.42
    CPUSystem: 60.23
    CPUChildrenUser: 507402
    CPUChildrenSystem: 58852.9
    CPULoad: 660.628
    Uptime: 85724
    ReqPerSec: 9.3583
    BytesPerSec: 186944
    BytesPerReq: 19976.3
    DurationPerReq: 3446.51
    BusyWorkers: 25
    IdleWorkers: 0
    Scoreboard: WWRWWWWWWWW...........W.......W...W..........................W.............W................W.........C.........W...W..W.......W.......W.........W.W..
    TLSSessionCacheStatus
    CacheType: SHMCB
    CacheSharedMemory: 512000
    CacheCurrentEntries: 0
    CacheSubcaches: 32
    CacheIndexesPerSubcaches: 88
    CacheIndexUsage: 0%
    CacheUsage: 0%
    CacheStoreCount: 0
    CacheReplaceCount: 0
    CacheExpireCount: 0
    CacheDiscardCount: 0
    CacheRetrieveHitCount: 0
    CacheRetrieveMissCount: 0
    CacheRemoveHitCount: 0
    CacheRemoveMissCount: 0

Если состояние появилось, значит, можно продолжить настройку шаблона Apache by Zabbix agent.

Настройка макросов шаблона Apache by Zabbix agent

При настройке макросов как минимум необходимо отредактировать значения {$APACHE.PROCESS_NAME} и {$APACHE.STATUS.PORT}.

Первое из них задает имя процесса Apache и здесь по умолчанию указана строка «httpd». В нашем случае процесс называется apache2, поэтому нужно изменить значение соответствующим образом.

Второй из перечисленных макросов задает номера порта, причем по умолчанию указан порт 80. Если ваш сервис Apache работает на другом порту, этот макрос необходимо отредактировать (рис. 1).

Рис. 1. Отредактированные макросы шаблона Apache by Zabbix agent
Рис. 1. Отредактированные макросы шаблона Apache by Zabbix agent

Макрос {$APACHE.RESPONSE_TIME.MAX.WARN} задает максимальное значение отклика Apache, после превышения которого срабатывает триггер Apache: Service response time is too high.

Что касается макросов {$APACHE.STATUS.SCHEME}, {$APACHE.STATUS.HOST} и {$APACHE.STATUS.PATH}, то они используются при составлении адреса URL для запроса состояния Apache:

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

Скорее всего, вам не придется изменять их значения.

Метрики шаблона Apache by zabbix agent

В шаблоне Apache by zabbix agent определено более двух десятков метрик. Кроме того, определены правило LLD для метрик MPM, имеющих отношение к соединениям, количеству асинхронных процессов и размеру запросов в байтах. 

Часть собираемых метрик показана на рис. 2.

Рис. 2. Часть метрик шаблона Apache by zabbix agent
Рис. 2. Часть метрик шаблона Apache by zabbix agent

Здесь определены метрики, определяющие работоспособность Apache и возможность получения статистических данных, метрики, измеряющие ресурсы, потребляемые сервисом Apache, отражающие статистику запросов, а также информацию о рабочих процессах (воркерах) Apache.

Полный список с описанием есть здесь.

Триггеры шаблона Apache by zabbix agent

В шаблоне Apache by zabbix agent определено шесть триггеров (рис. 3).

Рис. 3. Триггеры шаблона Apache by zabbix agent
Рис. 3. Триггеры шаблона Apache by zabbix agent

Самая высокая важность High у триггера Apache: Process is not running. Если установлен этот триггер, сервис Apache не работает, и сайты, расположенные на контролируемом узле, недоступны. Системному администратору необходимо срочно исправить данную ситуацию.

Возможно, Apache завершился аварийно из-за недостатка памяти или не перезапустился после изменения конфигурации, когда новая конфигурация содержит ошибки.

Также высокая важность Average у триггера Apache: Service is down. Этот триггер говорит о том, что агент Apache by zabbix agent не смог обнаружить запущенный процесс Apache.

Если сработал триггер Apache: Service response time is too high, у которого установлена важность Warning, то Apache плохо справляется с запросами, и нужно искать способы оптимизации.

Срабатывание триггера уровня предупреждения Warning с названием Apache: Failed to fetch status page говорит о том, что сбор статистики при помощи модуля status_module не настроен или по какой-то причине перестал работать.

И, наконец, триггеры Apache: has been restarted и Apache: Version has changed с минимальной важностью Information сообщают о перезапуске, а также об изменении версии Apache, соответственно.

Графики шаблона Apache by zabbix agent

В составе шаблона Apache by zabbix agent есть четыре графика, удобных для просмотра статистики по использованию ресурсов и запросам (рис. 4).

Рис. 4. Графики шаблона Apache by zabbix agent
Рис. 4. Графики шаблона Apache by zabbix agent

Графики Apache: Memory usage показывают постоянное потребление памяти RSS (Resident Set Size) и объем выделенной виртуальной памяти VSZ (Virtual Memory Size). Подробнее об управлении памятью в Linux можно прочитать, например, здесь.

Если Apache потребляет слишком много памяти, возможно, следует изменить конфигурацию Apache или использовать другой MPM. Рекомендации вы найдете ниже в этой статье.

Изменение количества рабочих процессов (воркеров) как запущенных, так и находящихся в состоянии ожидания, можно посмотреть на графике Apache: Workers total.

Детальная статистика по рабочим процессам показана на графике Apache: Worker states.

И, наконец, изменение интенсивности запросов в секунду можно отслеживать на графике Apache: Requests per second.

Определение установленного модуля MPM

Прежде чем приступить к оптимизации настроек Apache, следует определить, какой модуль мультипроцессовой обработки MPM (Multi-Processing Module) используется на контролируемом узле. Эти модули описаны в документации

Существует три модуля MPM:

Модуль Prefork создает дочерние процессы для обработки каждого поступающего запроса. Этот вариант самый надежный, но и самый медленный.

Модуль Worker не создает дополнительные процессы, а обрабатывает запросы при помощи потоков (threads). Этот вариант работает быстрее, так как не требуется создавать новые процессы, и потребляет меньше памяти.

И, наконец, модуль Event тоже обрабатывает запросы в одном процессе. Здесь потоки создаются только для активных соединений.

Сравнение этих модулей можно найти здесь.

Кроме перечисленных, на серверах хостинг-провайдеров совместно с модулем Prefork обычно используется модуль mpm_itk_module. Он позволяет сделать так, чтобы каждый сайт на хостинге работал под своим пользователем и будет установлен, в частности, панелью управления ISPmanager.

Для определения подключенных модулей MPM используйте следующую команду:

# apache2ctl -t -D DUMP_MODULES | grep mpm
    mpm_itk_module (shared)
    mpm_prefork_module (shared)

В данном случае используются модули mpm_itk_module и mpm_prefork_module.

При необходимости модуль mpm_itk_module можно установить и подключить  так:

# apt-get install libapache2-mpm-itk
    # a2enmod mpm_itk

При подключении mpm_itk_module был отключен модуль mpm_event и подключен модуль mpm_prefork:

Considering dependency mpm_prefork for mpm_itk:
    Considering conflict mpm_event for mpm_prefork:
    Considering conflict mpm_worker for mpm_prefork:
    Module mpm_prefork already enabled
    Module mpm_itk already enabled

Оптимизация потребления памяти

Оперативная память RAM на сервере — критичный ресурс, который следует расходовать экономно. Что касается Apache, то для поступающих запросов он запускает рабочие процессы (воркеры), потребляющие память.

На потребление памяти влияет состав модулей, подключенных в Apache. Полный список модулей можно посмотреть так:

# apache2ctl -t -D DUMP_MODULES

Ненужные модули для экономии памяти следует отключить. Однако учтите, что между модулями могут быть зависимости. При необходимости узнайте у разработчиков ПО, запущенного на сервере, какие модули Apache им нужны.

Другой способ ограничить использование памяти заключается в уменьшении максимально возможного количества запускаемых процессов MaxRequestWorkers.

При использовании MPM Prefork для этого нужно отредактировать файл /etc/apache2/mods-available/mpm_prefork.conf:    

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

После редактирования проверьте конфигурацию Apache, перезапустите сервис и проверьте его состояние:

# apache2ctl -t
    # systemctl restart apache2
    # systemctl status apache2

Конфигурации для MPM Worker и Event находятся, соответственно, в файлах /etc/apache2/mods-available/mpm_worker.conf и /etc/apache2/mods-available/mpm_event.conf.

В документации для вычисления значения MaxRequestWorkers предлагается разделить общий объем доступной памяти на средний размер памяти, выделенной для процесса Apache. Сколько выделяется памяти для процессов Apache, можно узнать с помощью команды top. Учтите, что память на сервере может быть нужна и для других сервисов, например, для MySQL, nginx, memcached и так далее.

Заметим, что в версиях Apache, более ранних, чем 2.3.13, параметр MaxRequestWorkers назывался MaxClients. Этот параметр может встретиться вам в многочисленных статьях, посвященных оптимизации Apache.

Также для экономии памяти имеет смысл использовать MPM Worker или Event.

Графики, построенные для метрик Apache при помощи Zabbix, окажут вам помощь в определении необходимого количества рабочих процессов, а также позволят контролировать память, выделенную для Apache (рис. 4).

Оптимизация производительности

Для повышения производительности Apache в документации рекомендуется использовать MPM Worker или Event, а также отключить модули, которые не используются.

Модуль mod_mpm_itk повышает безопасность, так как позволяет запускать разные сайты от имени разных пользователей, однако его использование ведет к снижению производительности.

Параметр MinSpareServers при использовании MPM Prefork задает минимальное количество запущенных рабочих процессов Apache. На запуск новых процессов уходит время и ресурсы, поэтому для увеличения производительности можно увеличить значение, равное по умолчанию пяти.

Подробные рекомендации по оптимизации Apache с точки зрения производительности вы найдете в этих статьях:

 

на главную сниппетов
Курсы