PHP-FPM на VPS: оптимизация пулов и производительности — иллюстрация к статье Storm Cloud Blog, категория Разработка
PHP-FPM на VPS: оптимизация пулов и производительности — иллюстрация к статье Storm Cloud Blog, категория Разработка
Разработка·2 мин··

PHP-FPM на VPS: оптимизация пулов и производительности

Тюнинг PHP-FPM на VPS: pm.max_children, opcache, пулы per site, расчёт RAM. WordPress и Laravel без тормозов на ограниченных ресурсах.

Краткий ответ: главный параметр PHP-FPM — pm.max_children. Рассчитайте его из доступной RAM: (RAM − система − MySQL) / средний размер PHP-процесса. Включите OPcache и используйте pm = dynamic.

PHP на VPS часто ест всю память из-за неправильного пула. После тюнинга WordPress и Laravel стабильно держат нагрузку на 2 GB RAM.


Как устроен PHP-FPM

Nginx → FastCGI → PHP-FPM pool → ваш PHP-код

Каждый запрос = PHP-процесс (или переиспользование из пула). Слишком много процессов = OOM killer. Слишком мало = очередь запросов.


Расчёт pm.max_children

# Средний размер PHP-процесса (MB)
ps -o rss= -C php-fpm8.3 | awk '{sum+=$1; n++} END {print sum/n/1024}'

Формула:

max_children = (Total RAM - 512MB система - MySQL RAM) / avg PHP process MB

Пример: 2 GB VPS, MySQL 512 MB, PHP ~50 MB:

(2048 - 512 - 512) / 50 ≈ 20

Рекомендуемый pool config

; /etc/php/8.3/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 8
pm.max_requests = 500
request_terminate_timeout = 60s
sudo systemctl restart php8.3-fpm

OPcache — бесплатный прирост

; /etc/php/8.3/mods-available/opcache.ini
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0  ; production — после деплоя reload fpm

В production validate_timestamps=0 + reload после deploy.


Отдельные пулы per site

; /etc/php/8.3/fpm/pool.d/laravel.conf
[laravel]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm-laravel.sock
pm = dynamic
pm.max_children = 15

Nginx:

fastcgi_pass unix:/run/php/php8.3-fpm-laravel.sock;

PHP-FPM + Nginx тюнинг

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_read_timeout 60;

Логи медленных запросов:

slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 5s

Диагностика — логи Nginx.


Кэширование уровня приложения

  • Redis для сессий и кэша Laravel
  • Object cache для WordPress
  • Cloudflare для статики

Мониторинг

# Статус пула
curl http://127.0.0.1/status?full  # нужен pm.status_path в pool

Метрики в Prometheus через php-fpm_exporter.


Типичные ошибки

  1. pm = ondemand на высоком трафике — лаг при cold start
  2. max_children = 200 на 2 GB — OOM
  3. OPcache выключен — CPU тратится на парсинг
  4. Нет бэкапов перед изменениями

Итог

PHP-FPM тюнинг — 20 минут работы, которые дают стабильность на маленьком VPS. Считайте RAM, включайте OPcache, мониторьте slow log.

VPS для PHP — StormNet Cloud. Деплой Laravel — Laravel на VPS.

Частые вопросы

Как узнать оптимальный pm.max_children?

Измерьте средний RSS PHP-процесса и разделите доступную RAM (минус ОС и MySQL). Не ставьте больше 30–40 на 2 ГБ VPS.

Нужен ли OPcache на production?

Обязательно. OPcache снижает нагрузку на CPU в разы, ускоряя PHP без изменений кода.