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

Apache Php Fpm Featured

Практически каждый教程 по установке 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

Apache Php Fpm Check Mpm Debian

Установите PHP-FPM.

apt install php-fpm

Вы увидите инструкции о том, как включить процессор PHP в Apache.

Apache Php Fpm Enable Php Instructions

Включите протокол 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

Apache Php Fpm Check Mpm Centos

Чтобы включить 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.

Apache Php Fpm Mpm Conffile On Centos

Теперь отмените комментирование (активируйте) строку #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

Apache Php Fpm Mpm Event Enabled Status Centos

Установите 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-программы.