PHP-FPM запускается до монтирования веб-папки в /etc/fstab, выдает ошибку

PHP-FPM запускается до монтирования веб-папки в /etc/fstab, выдает ошибку

Я использую обратный прокси-сервер LAEMP на Arch в облаке.

Моя nextcloud/dataпапка подключена к подключенному накопителю по адресу /mnt/hdd/nextcloud/data, связанному с /srv/www/nextcloud/data.

Если я этого не сделаю, а оставлю nextcloud/dataна том же диске, что и /, то у меня вообще не возникнет этой проблемы.

В reboot, система запускается; PHP-страницы получают ошибку, но ни , httpdни не nginxпоказывают никаких ошибок с systemctl status. Ошибка в php-fpm.

Вывод systemctl status php-fpm:

× php-fpm.service - The PHP FastCGI Process Manager
     Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; preset: disabled)
    Drop-In: /etc/systemd/system/php-fpm.service.d
             └─override.conf
     Active: failed (Result: exit-code) since Tue 2023-05-30 16:47:30 PDT; 14s ago
    Process: 316 ExecStart=/usr/bin/php-fpm --nodaemonize --fpm-config /etc/php/php-fpm.conf (code=exited, status=226/NAMESPACE)
   Main PID: 316 (code=exited, status=226/NAMESPACE)
        CPU: 8ms

May 30 16:47:29 MY_HOST systemd[1]: Starting The PHP FastCGI Process Manager...
May 30 16:47:29 MY_HOST (php-fpm)[316]: php-fpm.service: Failed to set up mount namespacing: /run/systemd/unit-root/mnt/hdd/nextcloud/data: No such file or directory
May 30 16:47:29 MY_HOST (php-fpm)[316]: php-fpm.service: Failed at step NAMESPACE spawning /usr/bin/php-fpm: No such file or directory
May 30 16:47:30 MY_HOST systemd[1]: php-fpm.service: Main process exited, code=exited, status=226/NAMESPACE
May 30 16:47:30 MY_HOST systemd[1]: php-fpm.service: Failed with result 'exit-code'.
May 30 16:47:30 MY_HOST systemd[1]: Failed to start The PHP FastCGI Process Manager.

Nextcloud получает это из systemddrop-in /etc/systemd/system/php-fpm.service.d/override.conf:

[Service]
...
ReadWritePaths=/srv/www/nextcloud/data

Когда я запускаю systemctl restart php-fpm, ошибка исчезает навсегда до следующей перезагрузки.

Я предполагаю, что php-fpmслужба не может найти nextcloudпапку, потому что hdd/не монтируется при php-fpmзапуске и хочет искать в своих веб-папках. Я думаю, что мне следует как-то настроить уровни запуска для php-fpmи/или (предпочтительно) при /etc/fstabзагрузке подключенного накопителя в /mnt/hdd.

/etc/fstabмонтирует диск /mnt/hddс помощью следующей инструкции:

/dev/vdc1               /mnt/hdd       ext4    defaults,noatime,nofail 0 0

Ничто из того, что я ищу в Интернете, не говорит мне, как решить эту проблему. Все в результатах поиска показывает не имеющие отношения к делу вопросы о php-fpmили /etc/fstab. Даже тогда, в лучшем случае я бы получил какой-нибудь ответ script kiddy.

Я хочу знать, как правильно выполнить vdc1монтирование гораздо раньше во время выполнения или, по крайней мере, дождаться php-fpm, пока каталог станет доступен, прежде чем устраивать истерику.

решение1

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

[Unit]
After=local-fs.target

Другим вариантом было бы добавить следующую опцию в определение монтирования в fstab:

x-systemd.required-by=php-fpm.service

решение2

Покадругой ответНа какое-то время мне помогло заявление внутри /etc/fstab, но изменение .serviceфайла оказалось для меня более надежным решением...

Нам нужнонекоторые заявленияв конфигурации сервиса, но под [Unit], а не [Service], что-то вроде:

[Unit]
Requires=local-fs.target
After=local-fs.target

Но вопрос в том, где их разместить и какими должны быть значения Requires=и After=.

Нам нужна услугапереопределение конфигурации вставки.

Служба — php-fpm, с ее исходным файлом конфигурации в /lib/systemd/system/php-fpm.service. Однако изменение этого не является постоянным, поскольку оно заменяется обновлениями. Вместо этого необходимо создать файл переопределения с любым именем и расширением .confв /etc/systemd/system/php-fpm.service.d/. Хотя /etc/systemd/system/он уже должен существовать со многими вещами в нем, php-fpm.service.d/может потребоваться создать подпапку.

На основе/etc/fstab:

UUID=long-uuid-serial-c0de1  /mnt/ssd       ext4    defaults,noatime,nofail,x-systemd.required-by=php-fpm.service 0 0 
UUID=long-uuid-serial-c0de2  /mnt/hdd       ext4    defaults,noatime,nofail,x-systemd.required-by=php-fpm.service 0 0

Этоткоманда:

systemctl list-units --type=mount

возвращает много строк, включая эти:

  mnt-hdd.mount                 loaded active mounted /mnt/hdd
  mnt-ssd.mount                 loaded active mounted /mnt/ssd

которые мы узнаем из /etc/fstabкак /mnt/hddи /mnt/ssd.

Итак, нам нужен этот файл:

/etc/systemd/system/php-fpm.service.d/mount.conf:

[Unit]
Requires=mnt-hdd.mount
After=mnt-hdd.mount
Requires=mnt-ssd.mount
After=mnt-ssd.mount

Связанный контент