Что такое PHP-FPM и зачем его настраивать
PHP-FPM (FastCGI Process Manager) — менеджер процессов PHP, который запускает PHP как отдельный сервис. В связке с Nginx он обеспечивает высокую производительность: Nginx обрабатывает статику, а PHP-FPM — динамические запросы. Правильная настройка PHP-FPM позволяет обслуживать в 2–5 раз больше запросов без увеличения RAM.
Файл конфигурации пула
Основной файл пула находится в /etc/php/8.x/fpm/pool.d/www.conf. Откройте его для редактирования:
sudo nano /etc/php/8.2/fpm/pool.d/www.confРежимы управления процессами (pm)
Параметр pm определяет, как PHP-FPM управляет дочерними процессами:
| Режим | Описание | Когда использовать |
|---|---|---|
static | Фиксированное число процессов | Высоконагруженные серверы с достаточной RAM |
dynamic | Число процессов меняется динамически | Большинство VPS (рекомендуется) |
ondemand | Процессы создаются по запросу | Сервер с малым трафиком, экономия RAM |
Оптимальные значения pm для dynamic
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 8
pm.max_requests = 500ps -o rss= -C php-fpm8.2 | awk '{ sum+=$1 } END { print sum/NR/1024 " MB" }'Slow Log — анализ медленных скриптов
Включите slow log для диагностики узких мест:
slowlog = /var/log/php8.2-fpm-slow.log
request_slowlog_timeout = 5sПросматривайте лог командой: tail -f /var/log/php8.2-fpm-slow.log
Страница статуса PHP-FPM
Добавьте в конфиг пула:
pm.status_path = /statusВ Nginx добавьте location:
location ~ ^/status$ {
allow 127.0.0.1;
deny all;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}Применение настроек
sudo systemctl reload php8.2-fpm
sudo systemctl status php8.2-fpmreload, который применяет конфиг без обрыва активных соединений.Конфигурация Nginx для PHP-FPM
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_read_timeout 300;
}