Настройка Nginx для PHP-FPM на Debian Ubuntu: пошаговая инструкция

Компьютеры, ноутбуки и программы в Москве.
Ответить
admin
Администратор
Сообщения: 20
Зарегистрирован: 22 дек 2009, 12:06

Настройка Nginx для PHP-FPM на Debian Ubuntu: пошаговая инструкция

Сообщение admin »

Архитектурный подход к связке Nginx и PHP-FPM

Современная веб-архитектура предполагает четкое разделение ответственности между компонентами системы. В связке 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, имеет права доступа на чтение и запись в Unix-сокет. Параметр pm.max_children должен рассчитываться исходя из доступной оперативной памяти: в среднем один процесс PHP-FPM потребляет от 30 до 80 МБ ОЗУ в зависимости от сложности приложения.

Настройка 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.
Правильная настройка буферов позволяет удерживать ответ бэкенда в оперативной памяти до полной передачи клиенту, минимизируя блокировки процессов PHP-FPM.
Также необходимо учитывать время выполнения скриптов. Если приложение выполняет тяжелые задачи (генерация отчетов, обработка изображений), стандартные 60 секунд могут привести к ошибке 504 Gateway Timeout.

Код: Выделить всё

fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_connect_timeout 300;
Увеличение этих значений должно сопровождаться соответствующими изменениями в php.ini (параметр max_execution_time), иначе PHP прервет выполнение раньше, чем Nginx закроет соединение.

Безопасность конфигурации

При настройке проксирования важно исключить возможность выполнения произвольного кода. Одной из классических уязвимостей является некорректная обработка PATH_INFO, когда злоумышленник может заставить интерпретатор исполнить вредоносный код, внедренный в файл изображения.
  1. В файле php.ini всегда устанавливайте cgi.fix_pathinfo=0. Это гарантирует, что PHP будет искать только точное совпадение имени файла.
  2. Используйте директиву try_files $uri =404 внутри блока обработки PHP. Это заставит Nginx проверить существование файла перед тем, как передавать запрос на бэкенд.
  3. Ограничивайте доступ к системным файлам и директориям систем контроля версий:

Код: Выделить всё

location ~ /\.(ht|git|svn) {
    deny all;
}
Диагностика и устранение проблем

При работе связки Nginx + PHP-FPM администраторы чаще всего сталкиваются с двумя типами ошибок:
  • 502 Bad Gateway: Означает, что Nginx не может связаться с сокетом или портом PHP-FPM. Причины: процесс FPM упал, неверные права на сокет или несовпадение путей к сокету в конфигурациях.
  • 504 Gateway Timeout: Бэкенд принял запрос, но не успел ответить в установленный лимит времени. Требуется оптимизация кода или увеличение тайм-аутов.
Для глубокого анализа необходимо использовать логи ошибок. В Nginx это /var/log/nginx/error.log, в PHP-FPM путь к логу определяется в конфигурации пула (директива error_log). Для мониторинга состояния процессов в реальном времени рекомендуется включить status page в настройках PHP-FPM, что позволит отслеживать количество активных и ожидающих соединений.

Дополнительную информацию по спецификациям протокола FastCGI можно найти на официальном сайте документации Nginx. Тщательная настройка параметров взаимодействия гарантирует стабильную работу веб-приложения даже под значительными нагрузками.
Ответить

Вернуться в «Компьютеры и программное обеспечение»