Современная веб-архитектура предполагает четкое разделение ответственности между компонентами системы. В связке Nginx и PHP-FPM первый выступает в роли обратного прокси-сервера (reverse proxy) и сервера статики, тогда как второй берет на себя выполнение динамического PHP-кода через протокол FastCGI. Такой подход обеспечивает высокую производительность, масштабируемость и безопасность.
Nginx не умеет исполнять PHP самостоятельно. Для этого он перенаправляет запросы к FastCGI-серверу (в данном случае PHP-FPM), который управляет пулом процессов интерпретатора. Взаимодействие между ними может происходить двумя способами: через Unix-сокеты или через TCP-стек. Unix-сокеты предпочтительнее для высоконагруженных систем на одном физическом сервере, так как они исключают накладные расходы сетевого стека ядра. TCP-сокеты используются, если Nginx и PHP-FPM разнесены на разные узлы.
Конфигурирование пула PHP-FPM
Прежде чем приступать к настройке Nginx, необходимо подготовить бэкенд. Основная конфигурация пулов PHP-FPM обычно располагается в директории /etc/php/X.X/fpm/pool.d/. Стандартный пул www.conf требует внимания к следующим параметрам:
Код: Выделить всё
user = www-data
group = www-data
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
Настройка Nginx в качестве прокси для FastCGI
Для проксирования запросов к PHP-FPM в конфигурационном файле виртуального хоста Nginx создается блок location, обрабатывающий файлы с расширением .php. Основная задача — правильно передать путь к скрипту и параметры окружения.
Код: Выделить всё
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_intercept_errors on;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
}
}
- fastcgi_pass: Указывает адрес FastCGI-сервера. Здесь должен быть путь к сокету или IP:порт.
- include fastcgi_params: Подключает стандартный набор переменных (QUERY_STRING, REQUEST_METHOD и др.), необходимых PHP для корректной обработки запроса.
- fastcgi_param SCRIPT_FILENAME: Критически важный параметр, сообщающий PHP-FPM, какой именно файл нужно исполнить.
- fastcgi_split_path_info: Позволяет корректно обрабатывать запросы вида script.php/extra/path, разделяя имя скрипта и дополнительный путь.
В высоконагруженных проектах стандартных настроек буферизации может быть недостаточно. Если PHP-скрипт генерирует большой объем данных, Nginx может начать сбрасывать их во временные файлы на диске, что резко снижает скорость. Для предотвращения этого настраиваются директивы fastcgi_buffers.
Также необходимо учитывать время выполнения скриптов. Если приложение выполняет тяжелые задачи (генерация отчетов, обработка изображений), стандартные 60 секунд могут привести к ошибке 504 Gateway Timeout.Правильная настройка буферов позволяет удерживать ответ бэкенда в оперативной памяти до полной передачи клиенту, минимизируя блокировки процессов PHP-FPM.
Код: Выделить всё
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_connect_timeout 300;
Безопасность конфигурации
При настройке проксирования важно исключить возможность выполнения произвольного кода. Одной из классических уязвимостей является некорректная обработка PATH_INFO, когда злоумышленник может заставить интерпретатор исполнить вредоносный код, внедренный в файл изображения.
- В файле php.ini всегда устанавливайте cgi.fix_pathinfo=0. Это гарантирует, что PHP будет искать только точное совпадение имени файла.
- Используйте директиву try_files $uri =404 внутри блока обработки PHP. Это заставит Nginx проверить существование файла перед тем, как передавать запрос на бэкенд.
- Ограничивайте доступ к системным файлам и директориям систем контроля версий:
Код: Выделить всё
location ~ /\.(ht|git|svn) {
deny all;
}
При работе связки Nginx + PHP-FPM администраторы чаще всего сталкиваются с двумя типами ошибок:
- 502 Bad Gateway: Означает, что Nginx не может связаться с сокетом или портом PHP-FPM. Причины: процесс FPM упал, неверные права на сокет или несовпадение путей к сокету в конфигурациях.
- 504 Gateway Timeout: Бэкенд принял запрос, но не успел ответить в установленный лимит времени. Требуется оптимизация кода или увеличение тайм-аутов.
Дополнительную информацию по спецификациям протокола FastCGI можно найти на официальном сайте документации Nginx. Тщательная настройка параметров взаимодействия гарантирует стабильную работу веб-приложения даже под значительными нагрузками.