Найти в Дзене
Игорь Пшеничный

Механизм взаимодействия Nginx, PHP-FPM и FastCGI.

Погрузимся в механизм взаимодействия 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

Погрузимся в механизм взаимодействия 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-приложений.