Tutorial

Настройка Apache HTTP с MPM Event и PHP-FPM в Ubuntu 18.04

ApacheLAMP StackUbuntu 18.04

Автор выбрал 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.

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

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

Шаг 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
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'

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

Output
mpm_event_module (shared)

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

  • sudo apachectl -M | grep 'proxy'

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

Output
proxy_module (shared) proxy_fcgi_module (shared)

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

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

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

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

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

info.php
<?php phpinfo(); ?>

Теперь откройте URL-адрес вашего сервера и добавьте info.php в конец следующим образом: http://your_domain/info.php.

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

Экран 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.

0 Comments

Creative Commons License