我有一个 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