Почти в каждом руководстве по установке стека LAMP (Linux, Apache, MySQL, PHP) рекомендуется использовать встроенный модуль Apache для обработки сценариев PHP. Например, в Ubuntu вы можете включить это, используя такую команду, как sudo apt install libapache2-mod-php
для установки пакета. Это, в свою очередь, заставит Apache использовать mpm_prefork. Каждый раз, когда посетитель заходит на ваш сайт, запускается новый процесс для обработки этого соединения. Это хорошо работает при низком трафике.
Но это становится огромной проблемой, если вы получаете внезапный всплеск трафика. Например, сообщение Reddit может включать ваш веб-сайт, и если сообщение станет популярным, вы можете привлечь тысячи посетителей всего за несколько минут.
В лучшем случае, если Apache сможет справиться с всплеском трафика, некоторым незадачливым посетителям, возможно, придется подождать от 30 до 60 секунд, пока страница загрузится, что абсурдно в современном мире. В худшем случае сервер начнет сильно отставать, и некоторые соединения будут просто разорваны из-за нехватки ресурсов. В этом случае посетители увидят ошибку в своих браузерах.
В любом случае это не лучший сценарий, поскольку вы потенциально потеряли внимание сотен или тысяч заинтересованных читателей, клиентов или поклонников.
К сожалению, PHP в любом случае требует значительных ресурсов. Но с mpm_event Apache может обрабатывать внезапные всплески трафика гораздо более эффективным способом. Однако рекомендуется, чтобы на вашем сервере было не менее 2 ГБ ОЗУ и 2 ядра ЦП, реальных или виртуальных, и даже больше, если вы ожидаете интенсивных скачков трафика, например, более десяти посетителей в секунду. Если вы используете виртуальный частный сервер, добавьте больше виртуальных ядер ЦП и SSD-хранилище. Оперативная память вторична.
Как использовать событие Apache MPM и PHP-FPM в дистрибутивах на основе Debian
В Debian, Ubuntu или других дистрибутивах этого семейства просто избегайте установки пакета "libapache2-mod-php". Когда вы устанавливаете Apache, он по умолчанию использует событие MPM. Но после установки упомянутого пакета сценарий отключает событие MPM и включает предварительную подготовку MPM. Модуль Apache PHP может работать (безопасно) только с mpm_prefork. Конечно, без "libapache2-mod-php" у вас не будет процессора для файлов PHP. Таким образом, вы будете использовать PHP-FPM вместо модуля PHP, включенного в Apache. Вот как вы установите стек LAMP на новый сервер. Вы можете адаптировать шаги в соответствии с требованиями вашего веб-приложения.
Сначала войдите в систему как root. Затем установите Apache.
apt update&&aptinstall apache2
На этом этапе вы можете видеть, что Apache действительно поставляется с включенным по умолчанию событием MPM.
apachectl - V
Установите PHP-FPM.
apt установить php-fpm
Вы увидите инструкции о том, как включить процессор PHP в Apache.
Включите протокол FastCGI.
a2enmod proxy_fcgi
Включите конфигурацию PHP-FPM по умолчанию для Apache.
a2enconf php7.0-fpm
Примечание: в будущих версиях Debian / Ubuntu эта команда может измениться на что-то другое, например a2enconf php7.6-fpm
, потому что PHP-FPM будет другой версией.
Перезагрузите Apache.
systemctl перезапустить apache2
Установите остальные требования для вашего PHP-приложения. Вот пример:
apt установить mariadb-сервер php-mysql
Это установит сервер базы данных и модуль PHP MySQL, чтобы ваше приложение PHP могло подключаться к базе данных.
Как использовать событие Apache MPM и PHP-FPM в дистрибутивах на основе RedHat
Другой популярный выбор серверного дистрибутива - RedHat или CentOS. Таким же образом, как и выше, будет предложен пример чистой установки Apache с включенным событием MPM и PHP-FPM.
Войдите в систему как root и установите Apache.
yum install httpd
В отличие от дистрибутивов на основе Debian, здесь вы увидите, что Apache по умолчанию использует предварительный форк MPM, по крайней мере, в последней версии CentOS 7, доступной на момент написания.
apachectl - V
Чтобы включить событие MPM, вам необходимо отредактировать файл конфигурации.
sed-i'/mpm_prefork\.so$/s/^/#/'/etc/httpd/conf.modules.d/00-mpm.conf
Это добавит знак #
для комментирования (деактивации) строки LoadModule mpm_prefork_module modules / mod_mpm_prefork.so
.
Теперь раскомментируйте (активируйте) строку #LoadModule mpm_event_module modules / mod_mpm_event.so
, удалив предыдущий знак #
следующей командой.
sed-i'/mpm_event\.so$/s/^#//'/etc/httpd/conf.modules.d/00-mpm.conf
Запустите Apache и включите его автозапуск при загрузке.
systemctl start httpd.servicesystemctl включить httpd.service
Проверьте, использует ли теперь Apache событие MPM.
apachectl - V
Установите модуль PHP-FPM и FastCGI.
yum install php-fpm mod_fcgid
Создайте "/etc/httpd/conf.d/php.conf", чтобы указать Apache, как обрабатывать файлы PHP. Скопируйте ВСЕ содержимое ниже и вставьте все сразу в терминал, затем нажмите ENTER.
catPASTE >/etc/httpd/conf.d/php.conf# Redirect to local php-fpm if mod_php is not availableIfModule !mod_php7.c>IfModule proxy_fcgi_module># Enable http authorization headersIfModule setenvif_module>SetEnvIfNoCase ^Authorization$ "(.+)"HTTP_AUTHORIZATION=$1IfModule>FilesMatch ".+\.ph(p[3457]?|t|tml)$">#SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"SetHandler "proxy:fcgi://127.0.0.1:9000"FilesMatch>FilesMatch ".+\.phps$"># Deny access to raw php sources by default# To re-enable it's recommended to enable access to the files# only in specific virtual host or directoryRequire all deniedFilesMatch># Deny access to files without filename (e.g. '.php')FilesMatch "^\.ph(p[3457]?|t|tml|ps)$">Require all deniedFilesMatch>IfModule>IfModule>PASTE
Заслуга за эту великолепную конфигурацию принадлежит Debian. Другие источники рекомендуют простой файл конфигурации, например:
SetHandler "proxy:fcgi://127.0.0.1:9000"
Но это уязвимо для некоторых атак, и в случае сбоя определенных служб вы можете сделать файлы PHP общедоступными, что, в свою очередь, потенциально может раскрыть сохраненные пароли, код и конфиденциальные данные.
Перезагрузите Apache.
systemctl перезапуск httpd.service
Запустите PHP-FPM и включите его автозапуск при загрузке.
systemctl start php-fpm.servicesystemctl включить php-fpm.service
Заключение
Теперь у вас есть сервер Apache, который намного лучше масштабируется с трафиком. Однако помните, что вы используете настройки по умолчанию, как в "лучших" для большинства людей. Если вы действительно хотите получить максимальную отдачу от своего HTTP-сервера, вам следует прочитать о различных переменных, которые вы можете настроить. Правильные значения для них во многом зависят от ресурсов вашего сервера, ожидаемого трафика и приложения PHP.