SystemdDoctor
php8.3-fpm.service phpчастое

php-fpm в systemd: почему не запускается и падает

php-fpm в systemd отвечает за пул рабочих процессов, и почти все его проблемы делятся на три группы: ошибка в описании пула (служба не стартует), права на unix-сокет (веб-сервер получает отказ), исчерпание рабочих процессов (сайт отвечает медленно или не отвечает).

О службе

Имя unit включает версию PHP: php8.3-fpm.service, php8.1-fpm.service и так далее. После обновления PHP на сервере остаются несколько unit одновременно, и типичная ошибка — перезапускать не тот. Проверять всегда стоит, какая версия действительно включена и какой сокет использует веб-сервер.

Сокет пула описывается в его файле настроек (/etc/php/8.3/fpm/pool.d/www.conf), а не в unit-файле: там задаются путь, владелец и права. Именно поэтому ошибки доступа к сокету решаются правкой описания пула, а не unit-файла. Веб-сервер должен иметь право писать в этот сокет — обычно через общую группу.

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

Как устроена

Имя unitзависит от версии: php8.3-fpm.service, php8.1-fpm.service
Проверка настроекphp-fpm8.3 -t — разбирает и основной файл, и описания пулов
Где описан сокетв файле пула (pool.d/*.conf), параметры listen, listen.owner, listen.group, listen.mode
Тип unitType=notify — php-fpm умеет сообщать systemd о готовности
Перезагрузка настроекsystemctl reload php8.3-fpm — корректная замена рабочих процессов

Частые ошибки

25 записей базы отмечены за этой службой.

Сообщения журнала

  • Permission denied в журнале службыОтказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
  • Address already in use при запуске службыПорт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
  • Connection refused в журнале службыСоединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.

Коды выхода

  • status=1/FAILURE в systemdКод 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
  • status=233/RUNTIME_DIRECTORY в systemdКод 233/RUNTIME_DIRECTORY: не удалось подготовить каталог службы в /run из RuntimeDirectory=. Права, режим, удаление при остановке.
  • status=200/CHDIR в systemdКод 200/CHDIR означает, что systemd не смог перейти в каталог из WorkingDirectory= до запуска программы. Причины и решение.
  • status=203/EXEC в systemdКод 203/EXEC означает, что systemd не смог выполнить программу из ExecStart=. Разбор причин: путь, права, интерпретатор, синтаксис оболочки.

Состояния результата

Ресурсы и ограничения

Сигналы

  • signal=SEGV (status=11/SEGV) в systemdПроцесс службы завершён сигналом SEGV: обращение к недопустимой памяти. Как собрать дамп и что смотреть.
  • signal=INT и signal=QUIT в systemdПроцесс службы завершён сигналом INT или QUIT. Кто их посылает службам и почему это обычно не systemd.

Ошибки служб

Таймеры, сокеты, монтирование

Коды выхода этой службы

Числа в status=N ниже 200 назначает сама программа, 200 и выше — systemd, когда не смог подготовить запуск.

statusЧто означает у этой службыКуда смотреть
1/FAILURE ошибка в описании пула или невозможность создать сокет. разбор
78/CONFIG часть сборок возвращает этот код при ошибке настроек. разбор
11/SEGV у рабочего процесса падение расширения PHP: смотрите, какое расширение обновлялось последним. разбор

Диагностика

Проверка настроек: печатает файл и строку с ошибкой в описании пула.

sudo php-fpm8.3 -t

Состояние службы и последние строки журнала.

systemctl status php8.3-fpm --no-pager -l

Предупреждения о достижении максимума рабочих процессов и о падениях дочерних.

journalctl -u php8.3-fpm -n 50 --no-pager | grep -iE "warning|error|child"

Существует ли unix-сокет пула и по какому пути.

sudo ss -xln | grep php

Может ли веб-сервер писать в сокет: главная проверка при ошибке шлюза.

sudo -u www-data test -w /run/php/php8.3-fpm.sock && echo доступ есть || echo отказ

Параметры unit, которые тут важны

  • Type=notify: php-fpm сообщает о готовности сам
  • ExecReload=перезагрузка сигналом USR2 — рабочие процессы заменяются мягко
  • RuntimeDirectory=каталог в /run для сокета и pid-файла
  • TasksMax=пул рабочих процессов упирается в предел задач при большом pm.max_children

Частые вопросы

nginx отдаёт 502, php-fpm при этом активен. Что смотреть?

Сначала путь к сокету: он должен совпадать в nginx и в описании пула. Затем права на сокет для пользователя веб-сервера. И только потом — журнал php-fpm на предмет падений рабочих процессов.

Источники

  • Документация PHP: FPM и настройка пулов документация программы
    сверено 15 сентября 2026
  • systemd.service(5) официальная документация
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04) собственная проверка
    сверено 15 сентября 2026