Как настроить Apache и PHP для веб-сайтов с высоким трафиком на сервере Linux

Практически каждый教程 по установке LAMP-стека (Linux, Apache, MySQL, PHP) рекомендует использовать встроенный модуль Apache для обработки PHP-скриптов. Например, в Ubuntu вы включаете это, используя команду sudo apt install libapache2-mod-php для установки пакета. Это, в свою очередь, заставляет Apache использовать mpm_prefork. Каждый раз, когда посетитель получает доступ к вашему веб-сайту, будет запущен новый процесс для обработки этого соединения. Это работает хорошо, когда трафик низкий.
Но это становится огромной проблемой, если у вас возникает резкий всплеск трафика. Например, пост на Reddit может включать вашу веб-страницу, и если пост станет популярным, вы можете получить тысячи посетителей всего за несколько минут.
В лучшем случае, если Apache сможет справиться с резким всплеском трафика, некоторым несчастным посетителям, возможно, придется ждать около тридцати-секунд до одной минуты, прежде чем страница загрузится, что абсурдно в современном мире. В худшем случае сервер начнет сильно тормозить, и некоторые соединения просто будут разорваны из-за недостатка ресурсов. В этом случае посетители увидят ошибку в своих браузерах.
Это не хороший сценарий ни в одном случае, так как вы потенциально потеряли внимание сотен или тысяч заинтересованных читателей, клиентов или фанатов.
К сожалению, PHP как кладец ресурсов в любом случае. Но с помощью mpm_event Apache может справляться с резкими всплесками трафика гораздо более эффективно. Рекомендуется, чтобы ваш сервер имел не менее 2 ГБ оперативной памяти и 2 ядра ЦП, реальных или виртуальных, и даже больше, если вы ожидаете резкие всплески трафика, такие как более десяти посетителей в секунду. Если вы используете виртуальный частный сервер, добавьте больше виртуальных ядер ЦП в вашу конфигурацию и SSD-накопитель. Оперативная память - это вторично.
Читать также: Nginx против Apache: что лучше для вас?
Как использовать Apache MPM Event и PHP-FPM на дистрибутивах на основе Debian
На Debian, Ubuntu или других дистрибутивах из этой семьи просто избегайте установки пакета “libapache2-mod-php”. Когда вы устанавливаете Apache, он по умолчанию использует MPM event. Но при установке указанного пакета скрипт отключает MPM event и включает MPM prefork. Модуль PHP Apache может работать только (безопасно) с mpm_prefork. Конечно, без “libapache2-mod-php” у вас нет процессора для PHP-файлов. Так что вы будете использовать PHP-FPM вместо модуля PHP, включенного в Apache. Вот как можно установить LAMP-стек на свежем сервере. Вы можете адаптировать шаги в соответствии с требованиями вашего веб-приложения.
Сначала войдите как root. Затем установите Apache.
apt update && apt install apache2На этом этапе вы можете увидеть, что Apache действительно поставляется с включенным по умолчанию MPM event.
apachectl-V
Установите PHP-FPM.
apt install 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 restart apache2Установите остальные требования для вашего PHP-приложения. Вот пример:
apt install mariadb-server php-mysqlЭто установит сервер базы данных и модуль PHP MySQL, чтобы ваше PHP-приложение могло подключаться к базе данных.
Читать также: Как защититься от DDoS-атак с помощью Mod_evasive на сервере Apache
Как использовать Apache MPM Event и PHP-FPM на дистрибутивах на основе RedHat
Другим популярным выбором серверного дистрибутива является RedHat или CentOS. Тем же образом, как выше, будет представлен пример чистой установки Apache с включенным MPM event и PHP-FPM.
Войдите как root и установите Apache.
yum install httpdВ отличие от дистрибутивов на основе Debian, здесь вы увидите, что Apache по умолчанию использует MPM prefork, по крайней мере, на последнем доступном на момент написания CentOS 7.
apachectl-V
Чтобы включить MPM event, вам нужно отредактировать конфигурационный файл.
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.service
systemctl enable httpd.serviceПроверьте, использует ли Apache теперь MPM event.
apachectl-V
Установите PHP-FPM и модуль FastCGI.
yum install php-fpm mod_fcgidСоздайте “/etc/httpd/conf.d/php.conf”, чтобы проинструктировать Apache, как обрабатывать PHP-файлы. Скопируйте ВСЕ содержимое ниже и вставьте его сразу в терминал, затем нажмите ENTER.
cat</etc/httpd/conf.d/php.conf
# Перенаправление на локальный php-fpm, если mod_php недоступен
# Включите заголовки аутентификации http
SetEnvIfNoCase ^Authorization$ "(.+)"HTTP_AUTHORIZATION=$1
IfModule>
#SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
SetHandler "proxy:fcgi://127.0.0.1:9000"
FilesMatch>
# По умолчанию запрещен доступ к исходным кодам php
# Чтобы повторно включить, рекомендуется включить доступ к файлам
# только в конкретном виртуальном хосте или каталоге
Require all denied
FilesMatch>
# Запрет доступа к файлам без имени (например, '.php')
Require all denied
FilesMatch>
IfModule>
IfModule>
PASTE Кредит за эту отличную конфигурацию принадлежит Debian. Другие источники рекомендуют простую конфигурацию, такую как:
SetHandler "proxy:fcgi://127.0.0.1:9000"
Но это уязвимо для некоторых атак, и если определенные сервисы потерпят неудачу, вы можете открыть PHP-файлы для публики, потенциально подвергая риску сохраненные пароли, код и данные.
Перезапустите Apache.
systemctl restart httpd.serviceЗапустите PHP-FPM и включите его автозапуск при загрузке.
systemctl start php-fpm.service
systemctl enable php-fpm.serviceЗаключение
Теперь у вас есть сервер Apache, который гораздо лучше справляется с трафиком. Однако помните, что вы используете настройки по умолчанию, то есть то, что “лучше всего” для большинства людей. Если вы действительно хотите извлечь максимальную выгоду из вашего HTTP-сервера, вам нужно изучить различные переменные, которые вы можете настроить. Правильные значения для этих переменных сильно зависят от ресурсов вашего сервера, ожидаемого трафика и вашей PHP-программы.