Урок 01

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.

Что дальше

  1. Настройка пулов FPM — производительность
  2. OPcache — кеш байт-кода
  3. PostgreSQL — установка и настройка
  4. Создание БД, подключение Laravel
  5. Бэкапы и восстановление
  6. Индексы и EXPLAIN
  7. Оптимизация медленных запросов
  8. Транзакции и блокировки
  9. Мониторинг PostgreSQL
  10. Безопасность БД
  11. Репликация и шардирование
  12. Практика: полная настройка прода

Итог

PHP-FPM установлен, работает через сокет, Nginx проксирует запросы.

Дальше — настройка пулов для производительности.