PHP-FPM startet, bevor der Webordner in /etc/fstab gemountet wird, gibt einen Fehler aus

PHP-FPM startet, bevor der Webordner in /etc/fstab gemountet wird, gibt einen Fehler aus

Ich betreibe einen LAEMP-Reverse-Proxy-Server auf Arch in der Cloud.

Ich habe meinen nextcloud/dataOrdner auf einem angeschlossenen Speicherlaufwerk unter gemountet /mnt/hdd/nextcloud/dataund mit verknüpft /srv/www/nextcloud/data.

Wenn ich dies nicht tue, sondern es nextcloud/dataauf derselben Festplatte belasse wie /, habe ich dieses Problem überhaupt nicht.

Bei rebootstartet das System; PHP-Seiten erhalten einen Fehler, aber weder httpdnoch nginxzeigen Fehler mit an systemctl status. Der Fehler liegt in php-fpm.

Ausgabe von 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 erhält dies vom systemdDrop-In /etc/systemd/system/php-fpm.service.d/override.conf:

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

Wenn ich ausführe systemctl restart php-fpm, verschwindet der Fehler dauerhaft bis zum nächsten Neustart.

Ich gehe davon aus, dass der Dienst den Ordner php-fpmnicht finden kann, weil er beim Start nicht gemountet ist und in seinen Webordnern suchen möchte. Ich würde denken, dass ich die Ausführungsebenen für und/oder (vorzugsweise) beim Laden des angeschlossenen Speicherlaufwerks irgendwie anpassen sollte .nextcloudhdd/php-fpmphp-fpm/etc/fstab/mnt/hdd

/etc/fstabmountet das Laufwerk /mnt/hddmit dieser Anweisung:

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

Nichts, wonach ich im Internet suche, sagt mir, wie ich dieses Problem lösen kann. Alles in den Suchergebnissen zeigt irrelevante Themen zu php-fpmoder /etc/fstab. Und selbst dann bekomme ich bestenfalls eine Script-Kiddy-Antwort.

Ich möchte wissen, wie ich vdc1das Mounten zur Laufzeit richtig viel früher durchführen kann oder dass ich zumindest php-fpmwarten kann, bis das Verzeichnis verfügbar ist, bevor ich einen Anfall bekomme.

Antwort1

Sie können die systemd-Einheit so konfigurieren, dass sie erst nach dem Mounten gestartet wird, indem Sie entweder der vorhandenen Drop-In-Datei die folgenden Konfigurationsoptionen hinzufügen oder, wenn Sie sie nicht ändern möchten, eine weitere hinzufügen:

[Unit]
After=local-fs.target

Eine andere Möglichkeit wäre, der Mount-Definition in fstab die folgende Option hinzuzufügen:

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

Antwort2

Währendeine andere Antworthat eine Zeit lang mit einer darin enthaltenen Anweisung geholfen /etc/fstab, das Ändern der .serviceDatei war am Ende meine zuverlässigere Lösung ...

Wir braucheneinige Aussagenin der Servicekonfiguration, aber unter [Unit], nicht [Service], ungefähr so:

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

Die Frage ist jedoch, wo sie platziert werden sollen und welche Werte für Requires=und gelten sollen After=.

Wir brauchen einen ServiceDrop-In-Override-Konfiguration.

Der Dienst ist php-fpm, mit seiner ursprünglichen Konfigurationsdatei unter /lib/systemd/system/php-fpm.service. Änderungen daran sind jedoch nicht dauerhaft, da sie durch Upgrades ersetzt werden. Stattdessen muss eine Override-Datei mit einem beliebigen Namen und der .confErweiterung in erstellt werden /etc/systemd/system/php-fpm.service.d/. Obwohl /etc/systemd/system/bereits viele Dinge darin vorhanden sein sollten, php-fpm.service.d/muss der Unterordner möglicherweise erstellt werden.

Bezogen auf/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

DasBefehl:

systemctl list-units --type=mount

gibt viele Zeilen zurück, darunter diese:

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

was wir an /etc/fstabund /mnt/hdderkennen /mnt/ssd.

Also brauchen wir diese Datei:

/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

verwandte Informationen