PHP-FPM (FastCGI Process Manager) — это современный способ обработки PHP-запросов, который значительно повышает производительность сайтов на WordPress, особенно при большом трафике. В статье рассмотрим, как правильно настроить PHP-FPM с несколькими пулами (multiple pools) для управления разными сайтами или частями сайта, а также как интегрировать это с веб-серверами Nginx и Apache.
Что такое PHP-FPM и multiple pools
PHP-FPM — это менеджер процессов PHP, который запускает пул рабочих процессов для обработки входящих запросов. В отличие от традиционного mod_php, PHP-FPM позволяет гибко управлять ресурсами, быстрее обрабатывать запросы и снижать нагрузку на сервер.
Multiple pools — это возможность создавать несколько отдельных пулов процессов PHP-FPM, каждый из которых может работать под своим пользователем, с разными настройками и ограничениями. Это особенно полезно в средах, где на одном сервере размещается несколько сайтов или проектов.
Для WordPress такая настройка позволяет изолировать ресурсы разных сайтов, повышая безопасность и стабильность.
Преимущества использования multiple pools в WordPress
1. Изоляция ресурсов: Каждый сайт работает в своем пуле с отдельным пользователем и настройками, что снижает риски безопасности и позволяет управлять лимитами памяти, процессами и временем выполнения отдельно.
2. Гибкость конфигурации: Можно настраивать разные параметры для сайтов с высокой и низкой нагрузкой.
3. Улучшенная производительность: Оптимизация под конкретные задачи и нагрузки позволяет снизить время отклика и повысить устойчивость сервера.
Настройка multiple pools PHP-FPM для WordPress на примере
Рассмотрим пример конфигурации для 2 сайтов на одном сервере с использованием PHP-FPM и Nginx.
Шаг 1. Создаем пользователей для сайтов
Для изоляции создадим отдельных пользователей:
sudo adduser wpuser1
sudo adduser wpuser2Шаг 2. Создаем конфигурации пулов
Конфигурационные файлы PHP-FPM обычно находятся в каталоге /etc/php/8.1/fpm/pool.d/ (версия PHP может отличаться).
Создадим файлы wpuser1.conf и wpuser2.conf с содержимым:
[wpuser1]
user = wpuser1
group = wpuser1
listen = /run/php/php8.1-fpm-wpuser1.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
chdir = /
[wpuser2]
user = wpuser2
group = wpuser2
listen = /run/php/php8.1-fpm-wpuser2.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 15
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
chdir = /Здесь каждый пул слушает на своем Unix-сокете, что позволяет Nginx или Apache направлять запросы на нужный пул.
Шаг 3. Настройка Nginx для работы с несколькими пулами
Для каждого сайта в конфигурации Nginx укажем соответствующий сокет PHP-FPM:
server {
server_name site1.example.com;
root /var/www/site1;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm-wpuser1.sock;
}
}
server {
server_name site2.example.com;
root /var/www/site2;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm-wpuser2.sock;
}
}Шаг 4. Права на файлы и папки
Важно, чтобы файлы WordPress были доступны соответствующим пользователям пула. Для этого устанавливаем владельцев и права:
sudo chown -R wpuser1:wpuser1 /var/www/site1
sudo chown -R wpuser2:wpuser2 /var/www/site2Это обеспечит изоляцию и безопасность.
Настройка с Apache и PHP-FPM
Если вы используете Apache, то можно настроить proxy_fcgi для каждого виртуального хоста.
<VirtualHost *:80>
ServerName site1.example.com
DocumentRoot /var/www/site1
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm-wpuser1.sock|fcgi://localhost/"
</FilesMatch>
</VirtualHost>
<VirtualHost *:80>
ServerName site2.example.com
DocumentRoot /var/www/site2
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm-wpuser2.sock|fcgi://localhost/"
</FilesMatch>
</VirtualHost>Это позволит Apache направлять PHP-запросы в нужный пул PHP-FPM.
Пример функции для wp-host.ru: автоматическое переключение пула PHP-FPM для мультисайта
Если у вас мультисайт WordPress и вы хотите динамически выбирать пул PHP-FPM, можно использовать фильтр для определения сокета. Приведем пример функции на PHP:
function wp_host_fpm_pool_for_site( $socket ) {
$site_id = get_current_blog_id();
switch ( $site_id ) {
case 1:
return '/run/php/php8.1-fpm-wpuser1.sock';
case 2:
return '/run/php/php8.1-fpm-wpuser2.sock';
default:
return $socket;
}
}<Далее эту логику можно интегрировать в конфигурацию или добавить в кастомный плагин для управления запросами.
Рекомендации по мониторингу и отладке
После настройки multiple pools важно следить за их состоянием. Используйте команды:
systemctl status php8.1-fpm— проверка статуса сервиса;php-fpm8.1 -tt— тест конфигурации;tail -f /var/log/php8.1-fpm.log— просмотр логов ошибок.
Для мониторинга нагрузки используйте инструменты, например, htop или специализированные сервисы.
Дополнительные плагины для оптимизации PHP-FPM на WordPress
Хотя PHP-FPM работает на уровне сервера, некоторые плагины могут помочь в совместной оптимизации:
- Clearfy Pro — оптимизация производительности и безопасности;
- WPRemark — управление комментариями и кешем;
- ABC Pagination — улучшение навигации и скорости загрузки.
Использование таких инструментов совместно с PHP-FPM multiple pools обеспечит комплексную оптимизацию WordPress.