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.
Типичные ошибки
pm = ondemandна высоком трафике — лаг при cold start- max_children = 200 на 2 GB — OOM
- OPcache выключен — CPU тратится на парсинг
- Нет бэкапов перед изменениями
Итог
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 без изменений кода.






