PHP-FPM inicia antes da pasta web ser montada em /etc/fstab, gera erro

PHP-FPM inicia antes da pasta web ser montada em /etc/fstab, gera erro

Estou executando um servidor proxy reverso LAEMP no Arch na nuvem.

Tenho minha nextcloud/datapasta montada em uma unidade de armazenamento conectada em /mnt/hdd/nextcloud/data, vinculada a /srv/www/nextcloud/data.

Se eu não fizer isso, mas mantiver nextcloud/datao mesmo disco que o /, não terei esse problema.

Em reboot, o sistema inicia; As páginas PHP apresentam um erro, mas não httpdmostram nginxnenhum erro com systemctl status. O erro está em php-fpm.

Saída de 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 está recebendo isso do systemddrop-in /etc/systemd/system/php-fpm.service.d/override.conf:

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

Quando executo systemctl restart php-fpm, o erro desaparece para sempre até a próxima reinicialização.

Presumo que o php-fpmserviço não consiga encontrar a nextcloudpasta porque hdd/não está montado quando php-fpmé iniciado e deseja procurar em suas pastas da web. Eu acho que deveria de alguma forma ajustar os níveis de execução para php-fpme/ou (de preferência) quando /etc/fstabcarregar a unidade de armazenamento anexada para /mnt/hdd.

/etc/fstabmonta a unidade /mnt/hddcom esta instrução:

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

Nada que procuro na Internet me diz como resolver esse problema. Tudo nos resultados da pesquisa mostra assuntos não relacionados sobre php-fpmou /etc/fstab. Mesmo assim, na melhor das hipóteses eu receberia alguma resposta infantil.

Quero saber a maneira correta de vdc1montar muito mais cedo no tempo de execução, ou pelo menos esperar php-fpmaté que o diretório esteja disponível antes de fazer um ajuste.

Responder1

Você pode configurar a unidade systemd para ser iniciada somente após as montagens, adicionando as seguintes opções de configuração ao arquivo existente ou adicionando outra se não quiser modificá-la:

[Unit]
After=local-fs.target

Outra opção seria adicionar a seguinte opção à definição de montagem no fstab:

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

Responder2

Enquantooutra respostaajudei por um tempo com uma declaração dentro /etc/fstab, modificar o .servicearquivo acabou sendo minha solução mais confiável...

Nós precisamosalgumas declaraçõesna configuração do serviço, mas em [Unit], não [Service], algo como:

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

Mas, a questão é onde colocá-los e para que servem os valores Requires=e After=.

Precisamos de um serviçoconfiguração de substituição drop-in.

O serviço é php-fpm, com seu arquivo de configuração original em /lib/systemd/system/php-fpm.service. No entanto, a modificação disso não é persistente, pois é substituída por atualizações. Em vez disso, era necessário criar um arquivo de substituição, com qualquer nome e .confextensão /etc/systemd/system/php-fpm.service.d/. Embora /etc/systemd/system/já deva existir com muitas coisas, php-fpm.service.d/pode ser necessário criar a subpasta.

Baseado em/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

Essecomando:

systemctl list-units --type=mount

retorna muitas linhas, incluindo estas:

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

que reconhecemos /etc/fstabcomo /mnt/hdde /mnt/ssd.

Então, precisamos deste arquivo:

/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

informação relacionada