什么原因导致 php-fpm (8.0.16) 无法写入 NFS 挂载的文件系统?

什么原因导致 php-fpm (8.0.16) 无法写入 NFS 挂载的文件系统?

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

<?php

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

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

fwrite($fp, 'test'); 

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

警告:fopen(test.txt):无法打开流:/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');

按预期工作。

当以与在 NFS 共享目录和 /tmp 中运行 php-fpm 相同的用户身份从命令行运行时,该脚本可以正常工作。此外,该脚本在早期版本的 php 上通过 php-fpm 正常运行。

答案1

在 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 的子目录中。

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

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

相关内容