Apache против узкого места PHP-FPM с дочерними процессами

Серверы Apache, которые используют предварительную версию MPM с меньшим количеством экземпляров сервера, чем максимальное количество дочерних процессов PHP-FPM, могут испытывать проблемы с производительностью. В этом документе объясняется, как решить эти проблемы с зависимостями.

Эта проблема и решение применимы только к серверам, на которых работает Apache в режиме MPM Prefork.

Проблема

В следующем сценарии конфигурация сервера PHP-FPM допускает максимум 20 дочерних процессов PHP-FPM, а конфигурация сервера Apache допускает пять экземпляров сервера.
В следующем примере представлен файл конфигурации сервера PHP-FPM:
_is_present: 1
pm_max_children: 20
pm_max_requests: 20
В следующем примере представлен файл конфигурации сервера Apache:
StartServers: 5
<IfModule prefork.c>
MinSpareServers: 10
MaxSpareServers: 10
</IfModule>
Если сервер Apache получает 20 запросов, он немедленно передает десять из этих запросов доступным дочерним процессам PHP-FPM. После того, как PHP-FPM обработает эти запросы, Apache передаст еще десять запросов PHP-FPM.

Предупреждение: Для серверов большого объема такая конфигурация может вызвать серьезные проблемы с производительностью.

Решение

Чтобы решить эту проблему, вы должны настроить Apache, чтобы позволить достаточному количеству экземпляров сервера обрабатывать максимальное количество дочерних процессов PHP-FPM. Для этого настройте следующие параметры:
  • Минимум запасных серверов (MinSpareServers)
  • Максимальное количество резервных серверов (MaxSpareServers)
  • Макс.рабочих запросов (MaxRequestWorkers)

Установите для этих параметров значение больше или равное параметру pm_max_children в файле конфигурации сервера PHP-FPM.

Установка mod_evasive на CentOS 7

Несмотря на то, что CentOS 7 более не поддерживается, она еще используется и под нее существуют ветки, а также ISO образы. Поэтому инструкции для CentOS все еще актуальны.

Если вы размещаете веб-сайт или веб-приложение, вы, вероятно, уже сталкивались с DoS-атакой или атакой подбора паролей, Mod_Evasive — это модуль, который обеспечивает уклонение в случае HTTP-DoS (не DDoS) или атак подбора пароля. Он также разработан как средство обнаружения и может быть легко настроен для сопряжения с межсетевым экраном, маршрутизатором или даже электронной почтой в определенных обстоятельствах.

В этом руководстве мы собираемся включить модуль mod_evasive на Apache, и мы собираемся сделать это с помощью расширения Apache.

ПРИМЕЧАНИЕ: Если ваш Apache был скомпилирован из исходного кода, вы должны убедиться, что модуль «mod_so» также был скомпилирован в него. в противном случае вы не сможете добавлять сторонние модули в свой Apache. вы можете проверить свои включенные модули с помощью следующей команды:
apachectl -M | grep mod_so

Установка зависимостей

Поскольку мы собираемся собрать mod_evasive из исходного кода, нам потребуются следующие установленные пакеты:
yum install httpd-devel -y
yum groupinstall "Development Tools" -y

Скачивание и сборка mod_evasive

Перейдите в каталог opt, чтобы получить исходный код mod_evasive из Github:
cd /opt/
Выполните следующую команду, чтобы загрузить исходный код:
wget https://codeload.github.com/shivaas/mod_evasive/zip/master
Разархивируйте исходный код с помощью следующей команды:
unzip master
Теперь перейдите в каталог:
cd mod_evasive-master
В этом разделе мы собираемся использовать инструмент apxs, который является очень полезным инструментом для добавления динамических общих объектов в уже работающий Apache. поэтому выполните следующую команду, чтобы добавить модуль mod_evasive:
apxs -i -c -a mod_evasive24.c
Если вы все сделали правильно, вы не увидите никаких ошибок. Чтобы изменения вступили в силу, перезапустите службу Apache:
systemctl restart httpd
Вы можете проверить, что модуль mod_evasive запущен и работает, с помощью следующей команды:
apachectl -M | grep evasive
Вы должны увидеть результат, как показано ниже:
evasive24_module (shared)

Конфигурация mod_evasive

Вы можете добавить свою конфигурацию в файл httpd.conf:
nano /etc/httpd/conf/httpd.conf
Вы должны разместить конфигурацию, как в следующем примере:
<IfModule mod_evasive24.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 60
DOSEmailNotify <YOU@YOURMAIL.COM>
</IfModule>
Чтобы начать работу с конфигурацией и параметрами Mod_Evasive, вы можете прочитать файл README, расположенный в исходном каталоге:
cat /opt/mod_evasive/README.md
Вы можете посетить официальную страницу Mod_Evasive на Github, чтобы получить дополнительную информацию и новости!

Как настроить nginx как фронтенд к Apache

В следующем примере мы настроим обратный прокси-сервер Nginx перед веб-сервером Apache. В результате мы предполагаем, что Apache уже установлен и настроен (на той же машине).
Обновите кэш пакетов APT и установите веб-сервер Nginx через Диспетчер пакетов:
apt update
apt install nginx -y
2. Отключите виртуальный хост по умолчанию, предварительно настроенный при установке Nginx через Диспетчер пакетов apt:
unlink /etc/nginx/sites-enabled/default
3. Перейдите в каталог /etc/nginx/sites-available и создайте файл конфигурации обратного прокси-сервера.
cd /etc/nginx/sites-available
nano reverse-proxy.conf
4. Вставьте следующую конфигурацию Nginx в текстовый редактор. Прокси-сервер перенаправляет все входящие соединения по порту 80 на сервер Webfsd, прослушивая порт 8443. Измените значение порта в зависимости от конкретного порта приложения.
server {
listen 80;
listen [::]:80
access_log /var/log/nginx/reverse-access.log;
error_log /var/log/nginx/reverse-error.log;
location / {
proxy_pass http://127.0.0.1:8443;
}
}
Примечание: обращения и ошибки находятся в файлах журнала по адресу /var/log/nginx.
5. Скопируйте конфигурацию из файла /etc/nginx/sites-available в файл /etc/nginx/sites-enabled. Рекомендуется использовать символическую ссылку.
ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/reverse-proxy.conf
6. Проверьте конфигурационный файл nginx
nginx -t
должно написать
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
7. Откройте веб-браузер на локальном компьютере и вставьте public_ip, который будет отображать домашнюю страницу веб-приложений.

Apache

Apache имеет долгую историю — он был запущен в 1995 году, поэтому ему уже более 20 лет. Его полное имя — HTTP-сервер Apache, а некоторые люди называют Apache просто httpd. Последние статистические данные показывают, что Apache — это веб-сервер, на котором работает более половины веб-сайтов в Интернете. Это, без сомнения, самый популярный доступный веб-сервер.
Apache не зависит от ОС, поэтому вы можете запускать Apache на чем угодно, от Windows до Mac OS X. Однако Apache обычно работает на каком-то варианте ОС Linux. Apache имеет открытый исходный код и распространяется под лицензией Apache License V2. Вы можете легко расширять Apache благодаря его модульной природе, просто добавляя дополнительные модули для включения дополнительных функций.
Читать дальше