Настройка Apache с помощью MPM Event и PHP-FPM
LAMP Stack, Ubuntu | Комментировать запись
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: Apache, FastCGI, MPM, php-fpm