PHP-FPM: введение и установка
Что такое PHP-FPM
PHP-FPM (FastCGI Process Manager) — менеджер процессов PHP. Держит пул готовых процессов, которые обрабатывают запросы от Nginx без перезапуска PHP на каждый запрос.
Раньше (mod_php, CGI):
- PHP запускался на каждый запрос
- 100-200 мс на старт
- Много памяти
С PHP-FPM:
- Процессы живут постоянно
- Обработка за 10-30 мс
- Память используется эффективно
Почему PHP-FPM, а не mod_php
mod_php — модуль для Apache. Работал внутри Apache, но:
- Много памяти на каждое соединение
- Плохо масштабируется
- Устарел
PHP-FPM — отдельный процесс:
- Отделён от веб-сервера
- Работает с любым веб-сервером (Nginx, Apache)
- Меньше памяти
- Лучше под нагрузкой
Установка
Ubuntu 22.04/24.04:
sudo apt update
sudo apt install -y \
php8.5-fpm \
php8.5-cli \
php8.5-pgsql \
php8.5-mbstring \
php8.5-xml \
php8.5-curl \
php8.5-zip \
php8.5-bcmath \
php8.5-intl \
php8.5-gd \
php8.5-redis
Проверка:
php -v
# PHP 8.5.10 (cli)
php-fpm8.5 -v
# PHP 8.5.10 (fpm-fcgi)
Что установилось
/usr/sbin/php-fpm8.5 — бинарник
/etc/php/8.5/fpm/ — конфиг FPM
/etc/php/8.5/fpm/php-fpm.conf — основной
/etc/php/8.5/fpm/pool.d/www.conf — пул
/etc/php/8.5/fpm/php.ini — php.ini для FPM
/etc/php/8.5/fpm/conf.d/ — доп. конфиги
/etc/php/8.5/fpm/pool.d/ — пулы
/var/log/php8.5-fpm.log — лог
/var/run/php/php8.5-fpm.sock — сокет
Управление сервисом
sudo systemctl start php8.5-fpm
sudo systemctl stop php8.5-fpm
sudo systemctl restart php8.5-fpm
sudo systemctl reload php8.5-fpm # мягко, без обрыва запросов
sudo systemctl status php8.5-fpm
sudo systemctl enable php8.5-fpm # автозапуск
reload vs restart:
reload— активные запросы завершатся, новые подхватятся новым конфигомrestart— активные оборвутся
На проде — всегда reload.
Проверка
1. Сервис работает:
sudo systemctl status php8.5-fpm
● php8.5-fpm.service - The PHP 8.5 FastCGI Process Manager
Active: active (running)
2. Сокет создан:
ls -la /var/run/php/
# srw-rw---- 1 www-data www-data php8.5-fpm.sock
3. Логи:
sudo tail -50 /var/log/php8.5-fpm.log
Связка с Nginx
Nginx не парсит PHP сам. Он отправляет FastCGI-запрос в PHP-FPM:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
}
fastcgi_pass — адрес PHP-FPM (сокет или 127.0.0.1:9000).
Проверка связки
1. Nginx знает про сокет:
grep fastcgi_pass /etc/nginx/sites-available/example.com
2. Сокет существует:
ls -la /var/run/php/php8.5-fpm.sock
3. Пути совпадают. Если Nginx идёт в php8.3-fpm.sock, а стоит php8.5 — 502 Bad Gateway.
4. Тест:
curl -I http://example.com
# HTTP/1.1 200 OK
# X-Powered-By: PHP/8.5.10
Если видишь X-Powered-By — PHP работает через FPM.
Что дальше
- Настройка пулов FPM — производительность
- OPcache — кеш байт-кода
- PostgreSQL — установка и настройка
- Создание БД, подключение Laravel
- Бэкапы и восстановление
- Индексы и EXPLAIN
- Оптимизация медленных запросов
- Транзакции и блокировки
- Мониторинг PostgreSQL
- Безопасность БД
- Репликация и шардирование
- Практика: полная настройка прода
Итог
PHP-FPM установлен, работает через сокет, Nginx проксирует запросы.
Дальше — настройка пулов для производительности.