Настройка Apache с помощью MPM Event и PHP-FPM

Apache_mpm_php_fpm

Apache HTTP сервер развивался много лет и сейчас может работать в разных средах и решать разные задачи. Одна из важных проблем, которую Apache HTTP (как и любой другой веб-сервер) должен решить – это обработка процессов для обслуживания запросов протокола http. Эта процедура подразумевает открытие сокета, обслуживание запроса, поддержку соединения в течение определенного времени, обработку новых событий, идущих через это соединение, и возврат контента, созданного программой, которая написана на определенном языке (например, PHP, Perl или Python). Эти задачи выполняет модуль MPM (модуль мультипроцессовой обработки).

Apache HTTP поставляется с тремя MPM-модулями:

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

PHP-FPM – менеджер процессов FastCGI для PHP. Протокол FastCGI основан на Common Gateway Interface (CGI), протоколе, который располагается между приложениями и веб-серверами. Это позволяет разработчикам писать приложения, независящие от поведения веб-серверов. Программы запускают свои процессы независимо и по протоколу CGI передают свой результат на веб-сервер. Каждое новое соединение, которое требует обработки приложением, создает новый процесс.

Комбинируя MPM Event с менеджером процессов PHP FastCGI (PHP-FPM), веб-сайт сможет загружаться быстрее и обрабатывать больше одновременных подключений, используя при этом меньшее количество ресурсов.

В этом руководстве вы узнаете, как улучшить производительность стека LAMP, заменив модуль pre-fork (по умолчанию) на event и используя менеджер процессов PHP-FPM для обработки кода PHP вместо классического mod_php в Apache HTTP.

Требования

  • Сервер Ubuntu 18.04. Настроить сервер нужно согласно этим инструкциям, включая сервер sudo и брандмауэр.
  • Предварительно установленный стек LAMP. Установить его вам поможет этот мануал.

1: Настройка MPM-модуля

Ubuntu наследует сценарии включения и отключения модулей Apache от своего родительского дистрибутива Debian. На начальном этапе мы воспользуемся этим набором инструментов, чтобы отключить модуль Pre-fork и включить модуль Event.

Сейчас вы остановите сервер Apache HTTP, отключите модуль PHP 7.2, связанный с модулем Pre-fork, а затем отключите Pre-fork, чтобы сразу после этого включить модуль Event.

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

sudo systemctl stop apache2

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

sudo a2dismod php7.2

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

sudo a2dismod mpm_prefork

Включите MPM-модуль Event:

sudo a2enmod mpm_event

Готово, мы переключили MPM с pre-fork на event и удалили соединение между PHP и Apache HTTP. На следующем этапе мы установим модуль php-fpm, а также связанные с ним библиотеки и прокси-модули, а затем настроим Apache HTTP так, чтобы он снова мог взаимодействовать с PHP.

2: Настройка Apache для поддержки FastCGI

Только что мы изменили способ обработки соединений Apache HTTP, переключившись с Pre-fork MPM на Event. Однако при этом мы также отключили модуль PHP, который связывал Apache со всеми программами, работающими на PHP.

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

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

sudo apt install php-fpm

Для связи Apache HTTP и PHP нужна библиотека, обеспечивающая их взаимодействие. Теперь давайте установим библиотеку libapache2-mod-fcgid, которая может служить интерфейсом между программами и веб-серверами. Эта связь будет происходить через UNIX-сокет. Установите ее:

sudo apt install libapache2-mod-fcgid

Вы установили php-fpm и libapache2-mod-fcgid, но ни один из этих компонентов еще не включен.

Сначала мы включим модуль php-fpm:

sudo a2enconf php7.2-fpm

Затем давайте модуль Apache HTTP под названием proxy:

sudo a2enmod proxy

А теперь можно включить FastCGI модуль proxy:

sudo a2enmod proxy_fcgi

Примечание: Вы можете прочитать конфигурацию взаимодействия между программами PHP и Apache через UNIX сокет с помощью команды:

cat /etc/apache2/conf-enabled/php7.2-fpm.conf

Теперь все готово, мы можем запустить Apache HTTP. Сначала выполните проверку конфигурации:

sudo apachectl configtest

Вы должны получить такой вывод:

Syntax OK

После этого можно приступать к перезапуску Apache HTTP – сервер автоматически запустился при установке FastCGI библиотеки libapache2-mod-fcgid:

sudo systemctl restart apache2

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

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

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

Чтобы убедиться, что изменения конфигурации были внесены правильно, мы проведем пару тестов. Первый тест проверит, какой MPM-модуль использует Apache HTTP. Второй убедится, что PHP использует FPM.

Проверьте HTTP-сервер Apache, выполнив следующую команду:

sudo apachectl -M | grep 'mpm'

Вы получите такой вывод:

mpm_event_module (shared)

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

sudo apachectl -M | grep 'proxy'

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

proxy_module (shared)
proxy_fcgi_module (shared)

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

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

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

sudo nano /var/www/your_domain/info.php

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

<?php phpinfo(); ?>

Теперь откройте URL-адрес вашего сервера и добавьте секцию info.php в конец адреса, например:

http://your_domain/info.php

В строке Server API будет FPM/FastCGI.

Обязательно удалите файл info.php после этой проверки, иначе конфиденциальная информация о вашем сервере будет находиться в публичном доступе.

sudo rm /var/www/yourdomain.com/info.php

Итак, мы проверили состояние MPM, модулей FastCGI и обработки кода PHP.

Заключение

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

Читайте официальную документацию по HTTP-серверу Apache для получения дополнительной информации о других модулях и связанных проектах.

Tags: , , ,

Добавить комментарий