На сегодня Apache представляет собой одно из самых популярных ПО для создания Web-сервера. Среди достоинств Apache — доступность, гибкость настройки, модульная структура, позволяющая подключать необходимую функциональность, совместимость с различными платформами, языками программирования и базами данных, масштабируемость и огромное сообщество пользователей.
Очень часто Apache работает в паре с NGINX, об установке и мониторинге которого мы рассказывали в предыдущей статье. Вы также можете создать быстрый сайт вообще без Apache, используя только NGINX или другое высокопроизводительное решение.
Но если по тем или иным причинам ваши сайты работают на базе Apache, имеет смысл настроить мониторинг и при необходимости оптимизировать конфигурацию Apache. В этой статье мы расскажем о том, как установить Apache и настроить его мониторинг помощи Zabbix. Также приведем рекомендации по оптимизации памяти и повышения производительности.
Если на вашем сервере установлена панель управления, такая как 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:
# 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
Когда на 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, настроили конфигурацию 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.PROCESS_NAME} и {$APACHE.STATUS.PORT}.
Первое из них задает имя процесса Apache и здесь по умолчанию указана строка «httpd». В нашем случае процесс называется apache2, поэтому нужно изменить значение соответствующим образом.
Второй из перечисленных макросов задает номера порта, причем по умолчанию указан порт 80. Если ваш сервис Apache работает на другом порту, этот макрос необходимо отредактировать (рис. 1).
Макрос {$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 определено более двух десятков метрик. Кроме того, определены правило LLD для метрик MPM, имеющих отношение к соединениям, количеству асинхронных процессов и размеру запросов в байтах.
Часть собираемых метрик показана на рис. 2.
Здесь определены метрики, определяющие работоспособность Apache и возможность получения статистических данных, метрики, измеряющие ресурсы, потребляемые сервисом Apache, отражающие статистику запросов, а также информацию о рабочих процессах (воркерах) Apache.
Полный список с описанием есть здесь.
В шаблоне Apache by zabbix agent определено шесть триггеров (рис. 3).
Самая высокая важность 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 есть четыре графика, удобных для просмотра статистики по использованию ресурсов и запросам (рис. 4).
Графики 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.
Прежде чем приступить к оптимизации настроек Apache, следует определить, какой модуль мультипроцессовой обработки MPM (Multi-Processing Module) используется на контролируемом узле. Эти модули описаны в документации.
Существует три модуля MPM:
Prefork;
Worker;
Event
Модуль 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 с точки зрения производительности вы найдете в этих статьях:
на главную сниппетов