Установка php8.3-fpm завершилась неудачей с ошибкой в постустановочном скрипте

Вопрос или проблема

Я устанавливал redis и столкнулся с ошибкой установки php8.3-fpm. Вот соответствующие сообщения об установке:

apt install redis-server
...
...
Настройка php8.3-fpm (8.3.6-0ubuntu0.24.04.2) ...
УВЕДОМЛЕНИЕ: PHP 8.3 FPM не включен по умолчанию.
УВЕДОМЛЕНИЕ: Чтобы включить PHP 8.3 FPM в Apache2, выполните:
УВЕДОМЛЕНИЕ: a2enmod proxy_fcgi setenvif
УВЕДОМЛЕНИЕ: a2enconf php8.3-fpm
УВЕДОМЛЕНИЕ: Вы видите это сообщение, потому что у вас установлен пакет apache2.
Задача для php8.3-fpm.service завершилась неудачей, так как было превышено время ожидания.
Смотрите "systemctl status php8.3-fpm.service" и "journalctl -xeu php8.3-fpm.service" для получения подробной информации.
invoke-rc.d: initscript php8.3-fpm, действие "перезапуск" завершилось неудачей.
× php8.3-fpm.service - Менеджер процессов FastCGI PHP 8.3
     Загружен: загружен (/usr/lib/systemd/system/php8.3-fpm.service; включен; предустановлено: включен)
     Активен: неактивен (Результат: тайм-аут) с Пн 2024-10-06 13:52:03 CEST; 16мс назад
       Документы: man:php-fpm8.3(8)
    Процесс: 285882 ExecStart=/usr/sbin/php-fpm8.3 --nodaemonize --fpm-config /etc/php/8.3/fpm/php-fpm.conf (код=вышел, статус=0/УСПЕХ)
    Процесс: 285889 ExecStopPost=/usr/lib/php/php-fpm-socket-helper remove /run/php/php-fpm.sock /etc/php/8.3/fpm/pool.d/www.conf 83 (код=вышел, статус=0/УСПЕХ)
   Главный PID: 285882 (код=вышел, статус=0/УСПЕХ)
        CPU: 90мс

06 окт 13:50:33 Ubuntu-2404-noble-amd64-base systemd[1]: Запуск php8.3-fpm.service - Менеджер процессов FastCGI PHP 8.3...
06 окт 13:52:03 Ubuntu-2404-noble-amd64-base systemd[1]: php8.3-fpm.service: операция запуска завершилась тайм-аутом. Завершение.
06 окт 13:52:03 Ubuntu-2404-noble-amd64-base systemd[1]: php8.3-fpm.service: Завершено с результатом 'тайм-аут'.
06 окт 13:52:03 Ubuntu-2404-noble-amd64-base systemd[1]: Не удалось запустить php8.3-fpm.service - Менеджер процессов FastCGI PHP 8.3.
dpkg: ошибка при обработке пакета php8.3-fpm (--configure):
 последний сценарий post-installation для установленного пакета php8.3-fpm завершился с кодом выхода 1
Настройка libjemalloc2:amd64 (5.3.0-2build1) ...
Настройка liblzf1:amd64 (3.6-4) ...
Настройка redis-tools (5:7.0.15-1build2) ...
Настройка redis-server (5:7.0.15-1build2) ...
Создан симлинк /etc/systemd/system/redis.service → /usr/lib/systemd/system/redis-server.service.
Создан симлинк /etc/systemd/system/multi-user.target.wants/redis-server.service → /usr/lib/systemd/system/redis-server.service.
Обработка триггеров для man-db (2.12.0-4build2) ...
Обработка триггеров для libc-bin (2.39-0ubuntu8.3) ...
Во время обработки возникли ошибки:
 php8.3-fpm
needrestart пропускается, так как dpkg завершился с ошибкой
E: Подпроцесс /usr/bin/dpkg вернул код ошибки (1)

Сообщения systemctl и journalctl не особенно информативны – просто сообщают, что php8.3-fpm не удалось запустить с результатом ‘тайм-аут’.

Ошибка, похоже, связана с обработкой dpkg php8.3-fpm : последующий сценарий post-installation для установленного пакета php8.3-fpm завершился с кодом выхода 1

Содержимое /var/lib/dpkg/info/php8.3-fpm.postinst:

#!/bin/sh

set -e

if [ -e /usr/share/apache2/apache2-maintscript-helper ]; then
    . /usr/share/apache2/apache2-maintscript-helper

    php_enable() {
        # Не включать PHP FPM по умолчанию, когда установлен Apache 2
        apache2_msg notice "УВЕДОМЛЕНИЕ: PHP 8.3 FPM не включен по умолчанию."
        apache2_msg notice "УВЕДОМЛЕНИЕ: Чтобы включить PHP 8.3 FPM в Apache2, выполните:"
        apache2_msg notice "УВЕДОМЛЕНИЕ: a2enmod proxy_fcgi setenvif"
        apache2_msg notice "УВЕДОМЛЕНИЕ: a2enconf php8.3-fpm"
        apache2_msg notice "УВЕДОМЛЕНИЕ: Вы видите это сообщение, потому что у вас установлен пакет apache2."
        return 1
    }
else
    php_enable() {
        # Не включать PHP FPM по умолчанию, когда Apache 2 не установлен
        return 1
    }
fi

if [ "$1" = "triggered" ] && [ "$2" = "/etc/php/8.3/fpm/conf.d" ]; then
    invoke-rc.d php8.3-fpm restart
fi

CONFDIR=/etc/php/8.3/fpm/conf.d

if [ "$1" = "configure" ]; then
    phpini="/etc/php/8.3/fpm/php.ini"

    if [ "fpm" = "cli" ]; then
        ucf /usr/lib/php/8.3/php.ini-production.fpm $phpini
    else
        ucf /usr/lib/php/8.3/php.ini-production $phpini
    fi
    ucfr php8.3-fpm $phpini

    if [ -e /usr/lib/php/php-maintscript-helper ]; then
        . /usr/lib/php/php-maintscript-helper
        
        mods=$(phpquery -M -v 8.3)
        for mod in $mods; do
            php_invoke enmod 8.3 fpm $mod
        done
    fi

    if [ -n "$2" ] && dpkg --compare-versions "$2" lt "7.0.3-2~"; then
        rm -f /etc/php/8.3/fpm/conf.d/20-opcache.ini;
    fi      
fi

# Автоматически добавлено dh_apache2/UNDECLARED
if php_enable; then
        if [ -e /usr/share/apache2/apache2-maintscript-helper ] ; then
                . /usr/share/apache2/apache2-maintscript-helper
                for conf in php8.3-fpm  ; do
                        apache2_invoke enconf $conf  || exit 1
                done
        fi
fi
# Конец автоматически добавленного раздела
# Автоматически добавлено dh_systemd_enable/13.14.1ubuntu5
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
        # Следующая строка должна быть удалена в trixie или trixie+1
        deb-systemd-helper unmask 'php8.3-fpm.service' >/dev/null || true

        # was-enabled по умолчанию равно true, поэтому новые установки выполняют enable.
        if deb-systemd-helper --quiet was-enabled 'php8.3-fpm.service'; then
                # Включает юнит при первой установке, создает новые
                # симлинки при обновлениях, если файл юнита изменился.
                deb-systemd-helper enable 'php8.3-fpm.service' >/dev/null || true
        else
                # Обновляет состояние, чтобы добавить новые симлинки (если они есть), которые нужно
                # очистить при очистке. Также удаляет старые симлинки.
                deb-systemd-helper update-state 'php8.3-fpm.service' >/dev/null || true
        fi
fi
# Конец автоматически добавленного раздела
# Автоматически добавлено dh_installinit/13.14.1ubuntu5
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
        if [ -x "$(command -v systemd-tmpfiles)" ]; then
                systemd-tmpfiles ${DPKG_ROOT:+--root="$DPKG_ROOT"} --create php8.3-fpm.conf || true
        fi
fi
# Конец автоматически добавленного раздела
# Автоматически добавлено dh_installdeb/13.14.1ubuntu5
dpkg-maintscript-helper rm_conffile /etc/init/php8.3-fpm.conf 7.4.3-4\~ php8.3-fpm -- "$@"
# Конец автоматически добавленного раздела
# Автоматически добавлено dh_installinit/13.14.1ubuntu5
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
        if [ -z "${DPKG_ROOT:-}" ] && [ -x "/etc/init.d/php8.3-fpm" ]; then
                update-rc.d php8.3-fpm defaults >/dev/null
                if [ -n "$2" ]; then
                        _dh_action=restart
                else
                        _dh_action=start
                fi
                invoke-rc.d php8.3-fpm $_dh_action || exit 1
        fi
fi
# Конец автоматически добавленного раздела


exit 0

Не знаком с работой dpkg, но exit 1 возникает в двух местах. Первый раз — при чтении конфигурационных файлов apache. Я удалил apache2, так что этот случай теперь не может вызвать ошибку. Второй раз просто сигнализирует о том, что запуск/перезапуск не удался.

Есть ли советы, что может быть проблемой? Это кажется выше моего уровня навыков.

Дополнительная информация: выполнение systemctl status php8.3-fpm.service возвращает

× php8.3-fpm.service - Менеджер процессов FastCGI PHP 8.3
     Загружен: загружен (/usr/lib/systemd/system/php8.3-fpm.service; включен; предустановлено: включен)
     Активен: неактивен (Результат: тайм-аут) с Пн 2024-10-07 11:34:21 CEST; 1мин 33с назад
       Документы: man:php-fpm8.3(8)
    Процесс: 334032 ExecStart=/usr/sbin/php-fpm8.3 --nodaemonize --fpm-config /etc/php/8.3/fpm/php-fpm.conf (код=вышел, статус=0/УСПЕХ)
    Процесс: 334035 ExecStopPost=/usr/lib/php/php-fpm-socket-helper remove /run/php/php-fpm.sock /etc/php/8.3/fpm/pool.d/www.conf 83 (код=вышел, статус=0/УСПЕХ)
   Главный PID: 334032 (код=вышел, статус=0/УСПЕХ)
        CPU: 98мс

07 окт 11:32:51 Ubuntu-2404-noble-amd64-base systemd[1]: Запуск php8.3-fpm.service - Менеджер процессов FastCGI PHP 8.3...
07 окт 11:34:21 Ubuntu-2404-noble-amd64-base systemd[1]: php8.3-fpm.service: операция запуска завершилась тайм-аутом. Завершение.
07 окт 11:34:21 Ubuntu-2404-noble-amd64-base systemd[1]: php8.3-fpm.service: Завершено с результатом 'тайм-аут'.
07 окт 11:34:21 Ubuntu-2404-noble-amd64-base systemd[1]: Не удалось запустить php8.3-fpm.service - Менеджер процессов FastCGI PHP 8.3.

Кроме того, если запустить службу вручную с помощью /usr/sbin/php-fpm8.3 --nodaemonize --fpm-config /etc/php/8.3/fpm/php-fpm.conf, это вернет

УВЕДОМЛЕНИЕ: fpm работает, pid 334206
УВЕДОМЛЕНИЕ: готов обрабатывать соединения
УВЕДОМЛЕНИЕ: интервал мониторинга systemd установлен на 10000мс
... больше сообщений нет

что указывает на успешный запуск fpm, но, возможно, есть проблема с systemd? Я имею дело с несовпадающими номерами PID?

PHP-FPM установлен как служба типа notify; это означает, что, цитируя systemd.service — Конфигурация юнита службы:

ожидается, что служба отправляет уведомление «READY=1» через sd_notify(3) или эквивалентный вызов, когда она завершит запуск

Согласно этой строке в вашем журнале:

не удалось уведомить статус systemd

что-то не так; это уведомление либо никогда не отправляется, либо никогда не доставляется.

Обходным путем для правильного запуска службы будет изменение типа службы на exec, изменив файл /lib/systemd/system/php8.3-fpm.service.

Чтобы сделать это, выполните:

sudo systemctl edit php8.3-fpm

Вы увидите закомментированную версию службы в редакторе (какой редактор будет зависеть от среды; по умолчанию в Ubuntu 24.04 это должен быть nano).

Измените файл так, чтобы он выглядел следующим образом:

[Service]
Type=exec

Затем сохраните файл (в nano: Ctrl + O / Enter / Ctrl + X).

Наконец, выполните:

sudo systemctl restart php8.3-fpm

Обратите внимание, что изменение /lib/systemd/system/php8.3-fpm.service (в отличие от ручного редактирования) необходимо, потому что обновление PHP-FPM может изменить /lib/systemd/system/php8.3-fpm.service, по сути отменив внесенные вами изменения.

Ответ или решение

Для решения проблемы с установкой php8.3-fpm, которая завершилась ошибкой, необходимо разобраться с ошибками, возникающими при запуске службы. Судя по предоставленным данным, основная проблема заключается в таймауте при запуске php8.3-fpm, что указывает на то, что служба не успевает сообщить системе о своем готовности к обработке запросов.

Сообщение о тайм-ауте может указывать на то, что php-fpm не отправляет уведомления о статусе, ожидаемые системой systemd. В соответствии с стандартами systemd, php-fpm должен отправить сообщение "READY=1" по завершении инициализации. Если это сообщение не отправляется, systemd считает, что служба не стартовала успешно.

Для обхода этой проблемы можно изменить тип службы php8.3-fpm на exec, что упростит процесс запуска и позволит избежать ожидания уведомления. Вот шаги, которые вам нужно выполнить:

  1. Создайте переопределение для службы php8.3-fpm:

    Выполните следующую команду в терминале:

    sudo systemctl edit php8.3-fpm

    Это откроет текстовый редактор (обычно nano), где вы сможете внести изменения.

  2. Измените тип службы:

    В открывшемся редакторе добавьте следующие строки:

    [Service]
    Type=exec

    Это изменит тип службы, что позволит избежать проблемы с таймаутом.

  3. Сохраните изменения и выйдите из редактора:

    • В nano: нажмите Ctrl + O, затем Enter для сохранения и Ctrl + X для выхода.
  4. Перезапустите службу php8.3-fpm:

    Теперь выполните команду для перезапуска службы:

    sudo systemctl restart php8.3-fpm
  5. Проверьте статус службы:

    После перезапуска проверьте статус, чтобы убедиться, что служба запущена успешно:

    systemctl status php8.3-fpm.service

Если служба теперь работает без ошибок, то проблема была решена. Если же проблема остается, проверьте логи в journalctl для получения дополнительных подсказок:

journalctl -xeu php8.3-fpm.service

Эта команда может предоставить более подробную информацию о том, что пошло не так при запуске службы. По результатам анализа логов можно будет предпринять дальнейшие шаги.

Если потребуется дополнительная помощь, не стесняйтесь задавать вопросы.

Оцените материал
Добавить комментарий

Капча загружается...