Apache linux выбор mpm

Обновлено: 05.07.2024

Модули в Apache

Для их отключения можно воспользоваться командами a2dismod <имя_модуля> а потом перезапустить конфигурацию сервера. Если вы отключите что-то не то, то включить модуль можно командой a2enmod <имя_модуля>. Опять же смотрите что отключайте, иначе какие-то функции ваших проектов могут перестать работать.

Кстати, как правило, кроме этих перечисленных модулей вам больше ничего не нужно:

Подходящий MPM

В apache каждый запрос обрабатывается в своем процессе или потоке. При компиляции apache позволяет выбирать один из нескольким MPM (Multi-processing module), которые отвечают за прослушивание портов, прием запросов и раздачу этих запросов дочерним процессам или потокам, в которых эти запросы будут обработаны.

Это пример для Debian систем:

Второй способ посмотреть подробную информацию о версии Apache. На CentOS:

Для смены MPM на некоторых ОС потребуется перекомпиляция apache, или установка соответствующего пакета apache (apache2-mpm-event, apache2-mpm-prefork, apache2-mpm-itk, apache2-mpm-worker).

DNS запросы

Поэтому в конфиг файле эта директива должна быть отключена: HostnameLookups Off

Content Negotiation

Если вам не Требуется, чтобы Apache
автоматически распознавал язык каждого посетителя и выдавал страницы на со ответствующем языке, то отключите данный модуль: a2dismod negotiation

FollowSymLinks и SymLinksIfOwnerMatch

Если опция FollowSymLinks включена для какой-то директории, то сервер будет следовать по символическим ссылкам данной директории. Если эта опция отключена, то Apache будет делать много лишних системных запросов. Держите ее включенной.

Если опция SymLinksIfOwnerMatch включена для какой-то директории, то сервер будет следовать по символическим ссылкам только в случае совпадения владельца этой директории и файла/директории куда ссылается эта ссылка. Это говорит о том что SymLinksIfOwnerMatch делает больше запросов, поэтому отключайте ее.

AllowOverride

Если будет запрошен файл /index.php, Apache будет пытаться открыть файлы /.htaccess, /var/.htaccess, /var/www/.htaccess, и /var/www/html/.htaccess, что увеличивает время запроса. Поэтому, если вам необходим этот файл только для одной директории, то включайте эту директиву только для нее:

MaxClients

Данная директива устанавливает максимальное количество запросов, которое будет обслуживать Apache. MaxCliets не должно быть много. Значение выставляется большим, чтобы обрабатывать одновременно много запросов, а меньшим для снижения потребления памяти!

MinSpareServers, MaxSpareServers, и StartServers

Директивы MaxSpareServers и MinSpareServers устанавливают как много процессов/потоков должны ожидать в готовности принять запрос (максимум и минимум). Если значение MinSpareServers слишком маленькое и неожиданно приходит много запросов, apache вынужден будет создавать много новых процессов/потоков, что создаст дополнительную нагрузку в этой стрессовой ситуации. С другой стороны, если MaxSpareServers слишком велико, apache будет сильно нагружать систему этими процессами, даже если количество клиентов минимально.

MaxRequestsPerChild

KeepAlive и KeepAliveTimeout

KeepAlive позволяет делать несколько запросов в одном TCP-подключении, что полезно для страниц с большим количеством изображений. Поэтому включайте KeepAlive и чтобы процессы не висели бесполезно ставьте KeepAliveTimeout в 5-10 секунд.

  • Pre-fork​​​: новый процесс создается для каждого входящего подключения к серверу. Каждый процесс изолирован от других процессов, то есть у них нет общей памяти, даже если они выполняют идентичные вызовы в определенный момент выполнения. Это безопасный способ запуска приложений, связанных с библиотеками, которые не поддерживают поточную обработку, обычно более старыми приложениями или библиотеками.
  • Worker: родительский процесс отвечает за запуск дочерних процессов, некоторые из которых ожидают новые входящие подключения, а другие обслуживают запрашиваемый контент. Каждый процесс является поточным (один поток может обрабатывать одно подключение), поэтому один процесс может обрабатывать несколько запросов параллельно. Этот метод обработки запросов обеспечивает более рациональное использование ресурсов и в то же время поддерживает стабильность. Это происходит из-за наличия пула имеющихся процессов, у которых зачастую есть свободные потоки, готовые сразу же обслуживать новые подключения.
  • Event​​​: этот MPM, основанный на worker, идет на шаг вперед, обеспечивая оптимизацию того, как родительский процесс распределяет задачи для дочерних процессов, а также связанные с ними потоки. Подключение остается открытым по умолчанию в течение 5 секунд и закрывается при отсутствии новых событий. Это управляющее значение по умолчанию с постоянным соединением, которое сохраняет потоки, связанные с ним. MPM Event позволяет процессу управлять потоками таким образом, что некоторые потоки могут свободно обрабатывать новые входящие подключения, в то время как другие остаются привязаны к активным подключениям. Возможность повторного распределения назначенных задач для потоков обеспечивает более рациональное использование ресурсов и повышает производительность.

Предварительные требования

Для прохождения этого обучающего руководства вам потребуется следующее:

  • Один сервер Ubuntu 18.04, настроенный в соответствии с руководством по начальной настройке сервера Ubuntu 18.04, включая пользователя non-root user с привилегиями sudo и брандмауэр.
  • Стек LAMP, установленный на вашем сервере в соответствии с указаниями руководства Установка Linux, Apache, MySQL, PHP (стека LAMP) на Ubuntu 18.04.

Шаг 1 — Изменение мультипроцессного модуля

Теперь вы можете отключить модуль PHP 7.2 , который связан с модулем Pre-fork:

Затем отключите модуль MPM Pre-fork:

Теперь активируйте модуль MPM Event:

Вначале установите php-fpm . Следующая команда установит пакет PHP-FPM, и он автоматически активирует службу php7.2-fpm , интегрированную с systemd, чтобы служба запускалась во время загрузки:

Установите эту библиотеку:

Вы установили php-fpm и libapache2-mod-fcgid , но они еще не активированы.

Вначале активируйте модуль php-fpm с помощью следующей команды:

Теперь Apache имеет активированный модуль MPM Event, присутствует и работает PHP-FPM, и сейчас самое время проверить, что все работает должным образом.

Шаг 3 — Проверка конфигурации

Вывод будет выглядеть следующим образом:

Вы можете повторить то же самое для модуля proxy и FastCGI:

Результат будет выглядеть так:

Если вы хотите увидеть весь список модулей, можно удалить вторую часть команды после -M .

Теперь пришло время проверить, использует ли PHP диспетчер процессов FastCGI. Для этого вы напишете небольшой скрипт PHP, который покажет вам всю информацию, связанную с PHP.

Запустите следующую команду, чтобы написать файл с именем:

Добавьте в файл info.php следующие строки:

Запись API сервера будет FPM/FastCGI​​​.

Экран PHP, запись API сервера FPM/FastCGI​​

Удалите файл info.php после этой проверки, чтобы в общем доступе не отображалась никакая информация о сервере:

Вы проверили рабочий статус модуля MPM, модули, обрабатывающие FastCGI, а также обработку кода PHP.

Заключение

Многие используют apache2 в качестве веб-сервера. Однако мало кто задумывается об оптимизации его производительности, что прямо пропорционально сказывается на скорости загрузки страниц сайта, скорости обработки скриптов (в частности php), а также на росте нагрузки на ЦП и увеличении объёма используемой ОЗУ.

Таким образом, следующий мануал, должен помочь начинающим (и не только) пользователям.
Все нижеприведённые примеры использовались на Raspberry PI 3, Debian 9, Apache 2.4.38, PHP 7.3.

Итак, начнем.

1. Отключение неиспользуемых модулей

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

Список используемых в данный момент модулей можно посмотреть командой:


Для отключения модуля используется команда:


Соответственно для включения модуля используется команда:


Обратите внимание, что при использовании a2dismod, название модуля необходимо писать без самого слова модуль.

К примеру, если вы в выводе команды apache2ctl -M увидели proxy_module, то для его отключения необходимо использовать команду — a2dismod proxy

Наиболее загружающими систему модулями (по личному опыту) являются:

  • PHP, Ruby, Perl и прочие модули для различных скриптовых языков
  • SSL
  • Rewrite
  • CGI

Также, после отключения какого-либо модуля, я рекомендую использовать команду — apache2ctl configtest, которая проверит конфигурацию используемых сайтов и если какой-либо из отключенных модулей был для них необходим, выдаст ошибку.

2. Смена MPM(Multi-Processing Module) и использование php-fpm

По умолчанию, после установки, apache2 использует MPM Prefork (1 поток на 1 соединение), который заметно снижает производительность, но при этом улучшает стабильность и безопасность.

Но для оптимизации производительности я рекомендую использовать MPM Worker, который позволяет использовать сразу несколько потоков на одно соединение.

Для его включения используем следующие команды:


Однако при использовании Worker вы можете столкнуться с проблемой, т.к. модуль php7.3 зависит от модуля Prefork.

Для решения этой проблемы установим модуль php7.3-fpm, который будет использоваться для отработки php-скриптов:


Стоит заметить, что использование php-fpm также снизит объём используемой ОЗУ процессом apache2 и немного ускорит отработку php-скриптов.

3. Заключение

Таким образом, такими простыми действиями мы смогли оптимизировать производительность и снизить нагрузку на машину (в данном случае RPI3).

Конечно же, есть сотни других вариантов оптимизации, вроде включения сжатия (что действительно полезно, но в большинстве своём уже включено по умолчанию), изменения параметров (файлов конфигурации) MPM, отключения HostnameLookups и т.д., но в данной статье я постарался отразить именно те пункты, которые больше всего помогли мне, и надеюсь, что помогут другим.


Apache продолжает оставаться наиболее широко используемым веб-сервером среди сайтов и компьютеров, подключенных к Интернету.

Кроме того, Apache продолжает демонстрировать наибольший рост среди ведущих веб-серверов, за которым следуют Nginx и IIS. Таким образом, если вы являетесь системным администратором, отвечающим за управление установками Apache, вам необходимо знать, как обеспечить максимальную производительность вашего веб-сервера в соответствии с вашими потребностями (или потребностями вашего клиента).

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

СОВЕТ № 1: Всегда обновляйте Apache до последней версии

В любом случае вы можете проверить установленную на данный момент версию следующим образом:

Check-Apache-Version


СОВЕТ № 2: Если вы используете ядро старше 2.4, рассмотрите возможность обновления

Зачем? В версиях ядра 2.4 и выше системный вызов ядра sendfile включен по умолчанию. Это, в свою очередь, облегчает высокопроизводительную сетевую передачу файлов (что желательно в контексте обмена данными между веб-сервером и клиентом) и позволяет Apache доставлять статический контент быстрее и с меньшим использованием ЦП, выполняя одновременные операции чтения и отправки.

Вы можете просмотреть ваше установленное ядро с помощью:

Check-Linux-Kernel-Version


СОВЕТ № 3: Выберите модуль мультиобработки (MPM), который лучше всего подходит для вашего случая

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

Начиная с версии 2.4, Apache предлагает на выбор три разных MPM в зависимости от ваших потребностей:

  • Prefork MPM использует несколько дочерних процессов без потоков. Каждый процесс обрабатывает одно соединение за раз без создания отдельных потоков для каждого. Не вдаваясь в подробности, мы можем сказать, что вы захотите использовать этот MPM только при отладке приложения, которое использует, или если вашему приложению нужно иметь дело с не поточно-безопасными модулями, такими как mod_php.
  • Worker MPM использует несколько потоков на дочерние процессы, где каждый поток обрабатывает одно соединение за раз. Это хороший выбор для серверов с большим трафиком, поскольку он позволяет обрабатывать больше одновременных соединений с меньшим объемом оперативной памяти, чем в предыдущем случае.
  • Наконец, event MPM является MPM по умолчанию в большинстве установок Apache для версий 2.4 и выше. Он похож на Worker MPM в том, что он также создает несколько потоков для каждого дочернего процесса, но с преимуществом: он заставляет KeepAlive или незанятые соединения (пока они остаются в этом состоянии) обрабатываться одним потоком, освобождая память, которая может выделяться другим потокам. Этот MPM не подходит для использования с не поточно-ориентированными модулями, такими как mod_php, для которого вместо этого должна использоваться замена такого PHP-FPM.

Чтобы проверить MPM, используемый вашей установкой Apache, вы можете сделать:

Изображение ниже показывает, что этот конкретный веб-сервер использует prefork MPM.

Check-Apache-MPM

Чтобы изменить это, вам нужно будет отредактировать:

Где <mpm> может быть mpm_event, mpm_worker или mpm_prefork и раскомментируйте строку, которая загружает нужный модуль следующим образом:

Примечание. Чтобы событие MPM работало в Debian, вам может потребоваться установить пакет libapache2-mod-fastcgi из платных репозиториев.

Кроме того, для CentOS вам понадобится php-fpm (вместе с fcgi и mod_fcgid), тогда как в Debian он называется php5-fpm (вместе с apache2-mpm-event).

И последнее, но не менее важное: перезапустите веб-сервер и недавно установленную службу php-fpm (или php5-fpm):

На RedHat/CentOS
В Debian / Ubuntu

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

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

Наконец, обратите внимание, что независимо от выбранного вами дистрибутива, php-fpm зависит от реализации FastCGI, поэтому я рекомендовал установку дополнительных пакетов ранее. Для получения более подробной информации и примеров о php-fpm и о том, как он может вместе с событием MPM повысить производительность Apache, вам следует обратиться к официальной документации.

Вот что я вижу после изменения MPM по умолчанию с prefork на событие в том же окне, что и на предыдущем изображении:

Choose-Apache-MPM-Module

Причина, по которой я это поднимаю этот впрос, заключается в том, что недавно я столкнулся с проблемой, когда настройки конфигурации firewalld по умолчанию в облачном VPS не позволяли php-fpm и Apache обрабатывать php-файлы.

Compare-Apache-Event-and-Prefork-Module

Это код php, который я сохранил в файле с именем checkiffileexists.php:

Затем мы запустим инструмент тестирования веб-сервера Apache (ab) с 200 одновременными запросами до 2000 запросов:

Давайте запустим тест и сравним результаты. Обратите внимание на статистику производительности:

Apache-Performance-Load-Testing

Как вы можете видеть, производительность сервера значительно превосходит его аналог prefork во всех аспектах этого теста.

СОВЕТ №4. Разумно распределяйте оперативную память для Apache

Для этого вы должны обратить внимание на средний объем оперативной памяти, используемой Apache, а затем умножить ее на количество MaxRequestWorkers, и это количество памяти, которое будет выделено для процессов веб-сервера Apache. Одна вещь, которую вы никогда не захотите, чтобы ваш веб-сервер начал использовать swap, так как это значительно снизит его производительность. Таким образом, вы всегда должны держать использование оперативной памяти Apache в пределах, которые вы можете себе позволить, и никогда не полагаться на swap.

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

В любом случае настоятельно рекомендуется обратиться к документации Apache 2.4, чтобы узнать, какие директивы разрешены для выбранного вами MPM.

СОВЕТ №5. Знайте свои приложения

Как правило, не следует загружать какие-либо модули Apache, которые не являются строго необходимыми для работы вашего приложения. Это потребует как минимум общих знаний о приложениях, запущенных на вашем сервере, особенно если вы системный администратор и есть другая команда, отвечающая за разработку.

Вы можете перечислить загруженные в данный момент модули с помощью:

С другой стороны, Debian предоставляет инструмент под названием a2dismod для отключения модулей и используется следующим образом:

Чтобы включить его обратно:

В любом случае, не забудьте перезапустить Apache, чтобы изменения вступили в силу.

Спасибо за уделенное время на прочтение статьи с 5 советами по повышению производительности веб-сервера Apache!

Если возникли вопросы, задавайте их в комментариях.

Подписывайтесь на обновления нашего блога и оставайтесь в курсе новостей мира инфокоммуникаций!

Читайте также: