Погрузимся в механизм взаимодействия Nginx, PHP-FPM и FastCGI. Это ключевая связка для работы PHP-приложений (включая WordPress) на высокопроизводительных серверах.
1. Архитектура взаимодействия
2. Детализация компонентов
PHP-FPM (FastCGI Process Manager)
- Назначение: Альтернатива стандартному PHP-CGI с улучшенным управлением процессами
- Архитектура:
- Master-процесс: Управляет пулом воркеров (читает конфиг, управляет жизненным циклом)
- Worker-процессы: Исполняют PHP-код (каждый воркер обрабатывает один запрос за раз)
- Преимущества:
- Поддержка graceful restart (без разрыва соединений)
- Адаптивное порождение процессов под нагрузку
- Статус мониторинга в реальном времени
FastCGI (FCGI)
- Эволюция CGI (Common Gateway Interface)
- Ключевые особенности:
- Постоянные процессы (вместо создания на каждый запрос)
- Асинхронная обработка запросов
- Поддержка multiplexing (один канал для множества запросов)
- Формат сообщений:
struct fcgi_record {
unsigned char version;
unsigned char type;
unsigned char requestIdB1;
unsigned char requestIdB0;
unsigned char contentLengthB1;
unsigned char contentLengthB0;
unsigned char paddingLength;
unsigned char reserved;
unsigned char contentData[contentLength];
unsigned char paddingData[paddingLength];
};
Сокеты (Unix Domain Sockets vs TCP)
- Unix Domain Sockets (UDS):
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
- Преимущества: На 30-50% быстрее, нет накладных расходов TCP
- Недостатки: Только для локального взаимодействия
TCP-сокеты:
fastcgi_pass 127.0.0.1:9000;
- Преимущества: Возможность распределенной системы
- Недостатки: Выше latency, расходы на установление соединения
3. Полный цикл обработки запроса
1. Инициализация соединения:
- При старте PHP-FPM создает master-процесс и слушающий сокет
- Nginx при загрузке конфига устанавливает параметры FastCGI
2. Получение HTTP-запроса:
- Клиент запрашивает https://site.com/page.php
- Nginx определяет обработчик по расширению .php
3. Формирование FastCGI-запроса:
Nginx преобразует HTTP-запрос в FastCGI-параметры:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
4. Передача в PHP-FPM:
- Nginx отправляет бинарный FastCGI-пакет через сокет
- Master-процесс PHP-FPM принимает запрос и делегирует свободному воркеру
5. Исполнение PHP:
- Worker загружает PHP-файл (SCRIPT_FILENAME)
- Интерпретатор выполняет код, взаимодействует с БД при необходимости
- Результат (HTML) записывается в стандартный вывод (stdout)
6. Обратная передача:
- Worker упаковывает вывод в FastCGI-ответ
- PHP-FPM отправляет пакет обратно в Nginx через сокет
7. Формирование HTTP-ответа:
Nginx добавляет HTTP-заголовки и отправляет финальный ответ:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
<!DOCTYPE html>...
4. Настройка производительности
Конфиг PHP-FPM (/etc/php/8.2/fpm/pool.d/www.conf):
; Стратегия управления процессами
pm = dynamic
; Максимум воркеров (рассчитывается: RAM / memory_per_worker)
pm.max_children = 50
; Воркеры при старте
pm.start_servers = 5
; Минимум свободных воркеров
pm.min_spare_servers = 2
; Максимум свободных воркеров
pm.max_spare_servers = 8
; Максимальное количество запросов на воркер перед рестартом
pm.max_requests = 500
; Сокет (оптимально для одного сервера)
listen = /var/run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
Конфиг Nginx (/etc/nginx/nginx.conf):
http {
# Буферизация FastCGI
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
# Таймауты
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 180s;
fastcgi_read_timeout 180s;
# Кэширование
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=PHP_CACHE:100m inactive=60m;
}
5. Почему это эффективно?
1. Разделение обязанностей:
- Nginx: Сетевое взаимодействие, статика, SSL
- PHP-FPM: Исполнение PHP-кода, управление процессами
2. Стабильность:
- Если PHP-скрипт упадет, это не повлияет на веб-сервер
- Master-процесс автоматически перезапустит воркер
3. Ресурсная эффективность:
- Постоянные процессы PHP (нет расходов на запуск)
- Один master управляет многими воркерами
- Nginx обрабатывает тысячи одновременных соединений
4. Гибкость масштабирования:
- Вертикальное: Увеличение pm.max_children
- Горизонтальное: Распределение воркеров по серверам
6. Мониторинг статуса PHP-FPM
Включите в конфиге ini:
pm.status_path = /status
Пример вывода json:
{
"pool": "www",
"process manager": "dynamic",
"accepted conn": 12543,
"listen queue": 0,
"max listen queue": 12,
"idle processes": 22,
"active processes": 3,
"total processes": 25
}
Критические метрики:
- `listen queue > 0` - Нехватка воркеров
- `active processes = max_children` - Достигнут лимит
- `slow requests > 0` - Проблемы производительности
Заключение
Nginx и PHP-FPM работают как слаженный дуэт: Nginx принимает запросы и выступает как прокси, а PHP-FPM через FastCGI-протокол исполняет PHP-код. Сокеты обеспечивают высокоскоростное межпроцессное взаимодействие. Эта архитектура позволяет эффективно обслуживать тысячи запросов в секунду, что делает её стандартом для высоконагруженных PHP-приложений.