Как настроить PHP‑воркеры WordPress на VPS: pm.max_children и оптимизация под нагрузку

Почему важны PHP‑воркеры для WordPress

WordPress работает в режиме запрос‑ответ, а каждый запрос обрабатывается отдельным процессом PHP‑FPM. Количество одновременно работающих процессов определяется параметром pm.max_children. Если значение слишком низкое – запросы будут ставиться в очередь, а сайт начнёт «тормозить». Слишком высокое значение приводит к избыточному потреблению RAM и может вызвать падение сервера.

Оптимальная настройка воркеров позволяет поддерживать стабильную скорость загрузки до 3 секунд даже при пиковых нагрузках.

Расчёт pm.max_children под ваш VPS

Шаг 1. Определяем объём памяти, доступный для PHP‑процессов

Допустим, у вас VPS с 4 ГБ RAM. Оставляем 20 % для системы и служб (nginx, MySQL, OS) → 3,2 ГБ = 3276 МБ.

Шаг 2. Узнаём среднее потребление памяти одним воркером

Запустите несколько запросов к WordPress и посмотрите в top или ps. Обычно воркер потребляет 70‑90 МБ, но для тяжёлых тем и плагинов – до 120 МБ.

Шаг 3. Формула расчёта

$available_memory = 3276; // МБ
$worker_memory    = 90;   // МБ (пример)
$max_children     = floor($available_memory / $worker_memory);
// $max_children = 36

Полученное значение и будет вашим pm.max_children. При росте нагрузки или установке новых плагинов пересчитайте.

Оптимизация остальных параметров FPM

pm = dynamic vs static

Для большинства WordPress‑сайтов рекомендуется pm = dynamic. Это позволяет автоматически масштабировать количество воркеров между pm.start_servers, pm.min_spare_servers и pm.max_spare_servers.

[www]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm.sock
pm = dynamic
pm.max_children = 36
pm.start_servers = 6
pm.min_spare_servers = 4
pm.max_spare_servers = 12
pm.max_requests = 5000

Параметр pm.max_requests заставляет воркер перезапускаться после заданного количества запросов, что помогает избежать «утечек памяти» в плохих плагинах.

Ограничение CPU

Если ваш VPS имеет ограничение по CPU (например, 2 ядра), добавьте в пул директиву php_admin_value[request_terminate_timeout] = 30 и php_admin_value[rlimit_cpu] = 60. Это гарантирует, что «зависший» скрипт будет принудительно завершён.

Мониторинг и автоподстройка воркеров

Настройка — лишь первый шаг. Нужно постоянно контролировать, как меняется нагрузка. Для этого используйте готовые решения:

  • Uptime мониторинг WordPress с интеграцией в Slack/Telegram.
  • Скрипт php-fpm_exporter + Grafana для визуализации active processes, idle processes и max children reached.
  • Автоматический скрипт, который раз в 5 минут читает /run/php/php-fpm.sock.status и при превышении 80 % max_children отправляет алерт.

Если вы видите постоянные алерты «max_children reached», увеличьте значение, но проверьте наличие свободной RAM.

Практический пример полной настройки на Ubuntu 22.04

1. Установка PHP‑FPM

sudo apt update
sudo apt install php8.2-fpm php8.2-mysql php8.2-xml php8.2-gd

2. Создаём отдельный пул для сайта

Файл /etc/php/8.2/fpm/pool.d/wordpress.conf:

[wordpress]
user = www-data
group = www-data
listen = /run/php/wordpress.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 36
pm.start_servers = 6
pm.min_spare_servers = 4
pm.max_spare_servers = 12
pm.max_requests = 5000
php_admin_value[request_terminate_timeout] = 30
php_admin_value[rlimit_cpu] = 60

3. Перезапуск службы

sudo systemctl restart php8.2-fpm

4. Настройка Nginx для использования сокета

server {
    listen 80;
    server_name example.com;
    root /var/www/wordpress;

    location ~ .php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/wordpress.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

5. Тестируем нагрузку

Запустите ab -n 1000 -c 50 http://example.com/. Если в логе FPM появляются сообщения «server reached max_children», вернитесь к расчётам и скорректируйте параметры.

Не забывайте про безопасность: регулярно проверяйте плагины безопасности WordPress и держите firewall в актуальном состоянии.

Для ускорения загрузки страниц также рекомендуется оптимизировать шрифты и заменить Google Fonts на Bunny Fonts.

Вывод

Правильный расчёт pm.max_children, тонкая настройка параметров dynamic и постоянный мониторинг позволяют выдерживать рост трафика без деградации скорости. Следуйте приведённым шагам, проверяйте метрики каждый день и корректируйте конфигурацию — и ваш WordPress на VPS будет работать быстро и стабильно.

❓ Часто задаваемые вопросы

Как узнать реальное потребление памяти одним PHP‑воркером?

Запустите несколько типовых запросов к сайту и в терминале выполните ps -ylC php-fpm7.4 --sort:rss или используйте top. Среднее значение RSS будет базой для расчёта pm.max_children.

Что делать, если после увеличения <code>pm.max_children</code> сервер начинает «падать»?

Проверьте, хватает ли свободной RAM. Если нет — уменьшите pm.max_children или добавьте swap, но лучше масштабировать VPS до большего объёма памяти.

Можно ли использовать отдельный пул PHP‑FPM для каждого сайта на одном VPS?

Да, это хорошая практика. Каждый пул имеет свой сокет и набор параметров, что изолирует ресурсы и упрощает мониторинг.

Как автоматически перезапускать воркеры при достижении лимита запросов?

Установите pm.max_requests (например, 5000). После обработки указанного количества запросов воркер будет перезапущен, что снижает риск утечек памяти.