Настройка PHP-FPM в Linux: от базовых параметров до продвинутых техник

Раздел: Администрирование Linux -> Установка и настройка PHP на Linux

Основные принципы настройки PHP-FPM в Linux

Как добиться оптимальной работы PHP-FPM для типового веб-проекта?

Основная идея настройки PHP-FPM заключается в выборе подходящего режима управления пулом процессов (pm) и конфигурации его параметров. Наиболее универсальное решение - динамический менеджер процессов (pm = dynamic), который автоматически подстраивает количество рабочих процессов под текущую нагрузку.

Пример минимальной конфигурации пула для сайта на WordPress:

[www]

user = www-data

group = www-data

listen = /run/php/php8.1-fpm.sock

pm = dynamic

pm.max_children = 10

pm.start_servers = 2

pm.min_spare_servers = 1

pm.max_spare_servers = 3

pm.max_requests = 500

chdir = /var/www/html

security.limit_extensions = .php .phar

Php fpm linux (настройка php-fpm в linux)

Параметр pm.max_children определяет максимальное количество процессов, которые может создать пул. Его рассчитывают исходя из доступной оперативной памяти: (Общая память - Память системы) / среднее потребление одного PHP-процесса. Для типового проекта 50-100 МБ на процесс - разумная оценка.

pm.max_requests заставляет процесс перезапускаться после обработки указанного числа запросов, что предотвращает утечки памяти, характерные для долго живущих PHP-скриптов.

Типичная ошибка: игнорирование лимита open files

При высоких нагрузках PHP-FPM может достичь лимита на открытые файловые дескрипторы. Решение - увеличить лимит в systemd (если используется) или в самом пуле:

[www]

rlimit_files = 65536

rlimit_core = unlimited

Php oracle linux (установка php на oracle linux)

Как настроить статический пул для предсказуемой нагрузки?

Режим pm = static создаёт фиксированное число процессов, которые всегда готовы к обработке. Это подходит для проектов с постоянным потоком запросов (например, API с высокой посещаемостью). Недостаток - неэффективное расходование памяти во время простоя.

[api]

pm = static

pm.max_children = 20

Linux apache php (настройка apache и php в linux)

Проблема: пул не успевает обрабатывать запросы при всплесках трафика

Решение - переход на динамический режим или увеличение pm.max_children, но тогда возрастает потребление памяти в простое.

Как организовать пул ondemand для экономии ресурсов?

Режим pm = ondemand создаёт процессы только при поступлении запроса и завершает их после простоя (pm.process_idle_timeout). Идеален для низконагруженных серверов или сайтов с редкими посещениями.

[lowload]

pm = ondemand

pm.max_children = 5

pm.process_idle_timeout = 10s

Php mysql linux (установка php и mysql в linux)

Ошибка: задержка первого запроса из-за создания процесса

При ondemand первый запрос после простоя обрабатывается немного дольше, так как требуется fork процесса. Влияние обычно незначительно (десятки миллисекунд), но для критичных по времени приложений лучше использовать dynamic.

Как настроить PHP-FPM через Unix-сокет вместо TCP?

Использование сокета (listen = /run/php/php-fpm.sock) снижает накладные расходы на TCP-стек и увеличивает производительность на локальной машине. Важно выставить корректные права:

listen = /run/php/php8.1-fpm.sock

listen.owner = www-data

listen.group = www-data

listen.mode = 0660

Linux версия php (проверка версии php в linux)

Веб-сервер (nginx) должен быть в той же группе или иметь права на чтение/запись сокета.

Проблема: ошибка 502 Bad Gateway при обращении через сокет

Причины - несовпадающие права или неверно указан путь к сокету в конфигурации nginx. Проверка: ls -la /run/php/ и сравнение с server unix:/run/php/php8.1-fpm.sock;.

Как ограничить доступ к PHP-FPM по IP через TCP?

Если требуется принимать соединения извне (например, для отдельного сервера приложений), используют TCP-порт и список разрешённых адресов:

listen = 127.0.0.1:9000

listen.allowed_clients = 127.0.0.1

Порт лучше не выставлять на публичные интерфейсы без фаервола.

Ошибка: пул отвечает на все интерфейсы по умолчанию

Значение listen = 9000 открывает порт на всех IP-адресах. Рекомендуется явно указывать 127.0.0.1:9000.

Расширенные примеры конфигурирования PHP-FPM

Как кастомизировать пул для разных сайтов на одном сервере?

Создание нескольких пулов с различными параметрами - стандартная практика для разделения проектов. Каждый пул должен иметь уникальное имя и отдельный сокет или порт.

Пример
[site1]

user = site1user

group = site1group

listen = /run/php/site1.sock

pm = dynamic

pm.max_children = 5

pm.start_servers = 1

pm.min_spare_servers = 1

pm.max_spare_servers = 3

pm.max_requests = 200

[site2]

user = site2user

group = site2group

listen = /run/php/site2.sock

pm = ondemand

pm.max_children = 3

pm.process_idle_timeout = 15s

pm.max_requests = 100

Результат: каждое приложение работает изолированно, потребляет ресурсы по своему профилю нагрузки.

Как изменить настройки PHP для конкретного пула через php_admin_value?

Директивы php_admin_value и php_admin_flag позволяют переопределить параметры php.ini на уровне пула. Это удобно для установки лимитов памяти или времени выполнения.

Пример
[pool_heavy]

php_admin_value[memory_limit] = 256M

php_admin_value[max_execution_time] = 120

php_admin_flag[expose_php] = Off

php_admin_value[upload_max_filesize] = 100M

php_admin_value[post_max_size] = 110M

Результат: пул для ресурсоёмкого приложения получит увеличенные лимиты, а остальные пулы будут использовать глобальные настройки.

Как настроить chroot для пула в целях безопасности?

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

Пример
[chrooted_pool]

chroot = /var/www/chroot

chdir = /

user = chroot_user

group = chroot_user

listen = /run/php/chrooted.sock

pm = dynamic

pm.max_children = 2

Внутри chroot необходимо создать dev/zero, dev/random, а также скопировать бинарники PHP (например, через chroot-helper).

Результат: при успешной атаке злоумышленник не увидит файлы за пределами chroot.

Как настроить логирование медленных запросов для отладки?

Включение лога медленных запросов помогает выявить узкие места в коде. Указывается порог времени и путь к лог-файлу.

Пример
[pool_debug]

request_slowlog_timeout = 2s

slowlog = /var/log/php-pool-slow.log

php_admin_value[max_execution_time] = 30

Пример содержимого лога:

[05-Nov-2024 10:15:32]  [pool pool_debug] pid 1234

script_filename = /var/www/html/slow.php

[0x00007f...] exec() /var/www/html/slow.php:12

Как принудительно перезапустить все пулы без остановки веб-сервера?

Грейсфул-перезагрузка службы PHP-FPM применяется при изменении конфигурации. Команда:

Пример
sudo systemctl reload php8.1-fpm

В случае ручного управления через сигнал:

Пример
sudo kill -USR2 $(cat /run/php/php8.1-fpm.pid)

Результат: существующие запросы завершаются старыми процессами, новые обрабатываются обновлёнными.

Настройка PHP-FPM в Linux - comments

En
Php fpm linux (php)