什么会阻止 php-fpm (8.0.16) 写入 NFS 挂载的文件系统?

What would prevent php-fpm (8.0.16) from being able to write to an NFS mounted filesystem?

我有一个无法将文件写入 NFS 共享的 php-fpm (8.0.16) 实例。我正在使用一个简单的 php 脚本进行测试:

<?php

ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);

$fp = fopen('test.txt', 'a');

fwrite($fp, 'test'); 

当通过 php-fpm 运行ning 时,在 NFS 共享目录中,收到以下错误:

Warning: fopen(test.txt): Failed to open stream: Read-only file system in /path/to/nfs/share/test-write.php

但是,下面的代码:

<?php

ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);

$fp = fopen('/tmp/test.txt', 'a');

fwrite($fp, 'test');

按预期工作。

脚本在 运行 从命令行作为用于 运行 php-fpm 的同一用户在 NFS 共享目录和 / tmp。 此外,该脚本通过 php-fpm 在 php 的早期版本上按预期工作。

在 systemd php-fpm.service 文件中有一个设置:

# Mounts the /usr, /boot, and /etc directories read-only for processes invoked by this unit.
ProtectSystem=full

这就是阻止 php-fpm 写入 NFS 共享的原因,因为它安装在 /usr 的子目录中。

如前所述 here 您可以使用 systemctl edit php-fpm.service 并添加需要写入权限的路径来覆盖它:

[Service]
ReadWritePaths=\path\that\needs\write\access