Table of Contents
*Автор выбрал COVID-19 Relief Fund для получения пожертвования в рамках программы Write for DOnations.*
Введение
Веб-сервер Apache HTTP эволюционировал все это время и теперь позволяет работать в разных средах и решать разные задачи. Важной проблемой, которую должен решать Apache HTTP, как и любой веб-сервер, является управление различными процессами для обслуживания запросов протокола http. Это подразумевает открытие сокета, обработку запроса, поддержание открытого подключения на определенный период, обработку новых событий, возникающих во время этого подключения, а также возврат контента, произведенного программой на определенном языке (например PHP, Perl или Python). Эти задачи выполняются и контролируются _мультипроцессными модулями_ (MPM).
Apache HTTP поставляется с тремя различными MPM:
- Pre-fork: новый процесс создается для каждого входящего подключения к серверу. Каждый процесс изолирован от других процессов, то есть у них нет общей памяти, даже если они выполняют идентичные вызовы в определенный момент выполнения. Это безопасный способ запуска приложений, связанных с библиотеками, которые не поддерживают поточную обработку, обычно более старыми приложениями или библиотеками.
- Worker: родительский процесс отвечает за запуск дочерних процессов, некоторые из которых ожидают новые входящие подключения, а другие обслуживают запрашиваемый контент. Каждый процесс является поточным (один поток может обрабатывать одно подключение), поэтому один процесс может обрабатывать несколько запросов параллельно. Этот метод обработки запросов обеспечивает более рациональное использование ресурсов и в то же время поддерживает стабильность. Это происходит из-за наличия пула имеющихся процессов, у которых зачастую есть свободные потоки, готовые сразу же обслуживать новые подключения.
- Event: этот MPM, основанный на worker, идет на шаг вперед, обеспечивая оптимизацию того, как родительский процесс распределяет задачи для дочерних процессов, а также связанные с ними потоки. Подключение остается открытым по умолчанию в течение 5 секунд и закрывается при отсутствии новых событий. Это управляющее значение по умолчанию с постоянным соединением, которое сохраняет потоки, связанные с ним. MPM Event позволяет процессу управлять потоками таким образом, что некоторые потоки могут свободно обрабатывать новые входящие подключения, в то время как другие остаются привязаны к активным подключениям. Возможность повторного распределения назначенных задач для потоков обеспечивает более рациональное использование ресурсов и повышает производительность.
Модуль MPM Event — это быстрый мультипроцессный модуль, доступный на веб-сервере Apache HTTP.
PHP-FPM — диспетчер процессов FastCGI для PHP. Протокол FastCGI основан на интерфейсе стандарта CGI (интерфейс общего шлюза), протоколе, который находится между приложениями и веб-серверами, например Apache HTTP. Это позволяет разработчикам писать приложения независимо от поведения веб-серверов. Программы запускают свои процессы независимо и передают свой продукт на веб-сервер посредством этого протокола. Каждое новое подключение, которое нуждается в обработке приложением, создаст новый процесс.
При сочетании MPM Event в Apache HTTP с диспетчером процессов PHP FastCGI (PHP-FPM) веб-сайт может выполнять загрузку быстрее и обрабатывать больше одновременных подключений и при этом использовать меньше ресурсов.
В этом обучающем модуле мы повысим производительность стека LAMP путем изменения мультипроцессного модуля с pre-fork на event и использования диспетчера процессов PHP-FPM для обработки кода PHP вместо классического mod_php в Apache HTTP.
Предварительные требования
Для прохождения этого обучающего руководства вам потребуется следующее:
- Один сервер Ubuntu 18.04, настроенный в соответствии с руководством по начальной настройке сервера Ubuntu 18.04, включая пользователя non-root user с привилегиями sudo и брандмауэр.
- Стек LAMP, установленный на вашем сервере в соответствии с указаниями руководства Установка Linux, Apache, MySQL, PHP (стека LAMP) на Ubuntu 18.04.
Шаг 1 — Изменение мультипроцессного модуля
Ubuntu наследует скрипты для включения или отключения модулей Apache HTTP из его родительского дистрибутива Debian. Вы будете использовать этот набор инструментов на этом этапе для отключения модуля Pre-fork и включения модуля Event.
В этом шаге вы остановите Apache HTTP, отключите модуль <^>PHP 7.2<^>, привязанный к модулю Pre-fork, и затем отключите Pre-fork, чтобы сразу же включить модуль Event.
Вначале вы остановите службу Apache HTTP:
sudo systemctl stop apache2
Теперь вы можете отключить модуль <^>PHP 7.2<^>, который связан с модулем Pre-fork:
sudo a2dismod <^>php7.2<^>
Затем отключите модуль MPM Pre-fork:
sudo a2dismod mpm_prefork
Теперь активируйте модуль MPM Event:
sudo a2enmod mpm_event
Вы изменили MPM с pre-fork на event и удалили соединение модуля <^>PHP 7.2<^> между PHP и Apache HTTP. В следующем шаге вы установите модуль php-fpm, а также связанные библиотеки и прокси-модули. Вы настроите Apache HTTP, чтобы он мог взаимодействовать также с PHP.
Шаг 2 — Настройка Apache HTTP для использования диспетчера процессов FastCGI
На этом этапе вы изменили способ подключений процессов Apache HTTP, переключив MPM Pre-fork на Event. Однако вы также отключили модуль PHP, который соединял Apache HTTP со всеми программами, выполняемыми на PHP.
На этом этапе вы установите процессор PHP-FPM, чтобы Apache HTTP опять смог обрабатывать программы PHP. Также вы установите библиотеки зависимостей и активируйте модули, чтобы они могли работать более слаженно и быстро, чем ранее.
Вначале установите php-fpm. Следующая команда установит пакет PHP-FPM, и он автоматически активирует службу <^>php7.2-fpm<^>, интегрированную с systemd, чтобы служба запускалась во время загрузки:
sudo apt install php-fpm
Для обмена данными для Apache HTTP и PHP потребуется библиотека, обеспечивающая эту возможность. Теперь вы установите libapache2-mod-fcgid, который может служить интерфейсом между программами с веб-серверами и является характерным для Apache HTTP. Этот обмен данными будет происходить через сокет UNIX.
Установите эту библиотеку:
sudo apt install libapache2-mod-fcgid
Вы установили php-fpm и libapache2-mod-fcgid, но они еще не активированы.
Вначале активируйте модуль php-fpm с помощью следующей команды:
sudo a2enconf <^>php7.2-fpm<^>
Затем активируйте модуль proxy Apache HTTP:
sudo a2enmod proxy
Теперь активируйте модуль proxy FastCGI в Apache HTTP:
sudo a2enmod proxy_fcgi
Примечание. Вы можете прочитать конфигурацию этого взаимодействия между программами PHP и Apache HTTP через сокет UNIX с помощью следующего:
cat /etc/apache2/conf-enabled/<^>php7.2-fpm.conf<^>
Теперь все готово, и можно запускать Apache HTTP. Сначала выполните проверку конфигурации:
sudo apachectl configtest
[secondary_label Output]
Syntax OK
После этого можно перейти к повторному запуску Apache HTTP, поскольку он был автоматически запущен при установке библиотеки FastCGI libapache2-mod-fcgid:
sudo systemctl restart apache2
Вы установили модуль php-fpm, настроили Apache HTTP для работы с ним, активировали необходимые модули для работы протокола FastCGI, а также запустили соответствующие службы.
Теперь Apache имеет активированный модуль MPM Event, присутствует и работает PHP-FPM, и сейчас самое время проверить, что все работает должным образом.
Шаг 3 — Проверка конфигурации
Чтобы проверить, что изменения конфигурации вступили в силу, вы выполните несколько тестов. Первый проверит, какой мультипроцессный модуль использует Apache HTTP. Второй проверит, что PHP использует менеджер FPM.
Проверьте сервер Apache HTTP, выполнив следующую команду:
sudo apachectl -M | grep 'mpm'
Вывод будет выглядеть следующим образом:
[secondary_label Output]
mpm_event_module (shared)
Вы можете повторить то же самое для модуля proxy и FastCGI:
sudo apachectl -M | grep 'proxy'
Результат будет выглядеть так:
[secondary_label Output]
proxy_module (shared)
proxy_fcgi_module (shared)
Если вы хотите увидеть весь список модулей, можно удалить вторую часть команды после -M.
Теперь пришло время проверить, использует ли PHP диспетчер процессов FastCGI. Для этого вы напишете небольшой скрипт PHP, который покажет вам всю информацию, связанную с PHP.
Запустите следующую команду, чтобы написать файл с именем:
sudo nano /var/www/<^>your_domain<^>/info.php
Добавьте в файл info.php следующие строки:
[label info.php]
<?php phpinfo(); ?>
Теперь откройте URL-адрес вашего сервера и добавьте info.php в конец следующим образом: http://<^>your_domain<^>/info.php.
Запись API сервера будет FPM/FastCGI.
Удалите файл info.php после этой проверки, чтобы в общем доступе не отображалась никакая информация о сервере:
sudo rm /var/www/yourdomain.com/info.php
Вы проверили рабочий статус модуля MPM, модули, обрабатывающие FastCGI, а также обработку кода PHP.
Заключение
Вы оптимизировали стек LAMP, поэтому количество подключений для создания новых процессов Apache HTTP увеличилось, PHP-FPM обрабатывает код PHP более эффективно, и в общем ресурсы стали использоваться рациональнее.
Дополнительную информацию о разных модулях и связанных проектах можно найти в документации по проекту сервера Apache HTTP.