Как настроить 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). После обработки указанного количества запросов воркер будет перезапущен, что снижает риск утечек памяти.