Php

什麼會阻止 php-fpm (8.0.16) 能夠寫入 NFS 掛載的文件系統?

  • February 21, 2022

我有一個無法將文件寫入 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 執行時,在作為 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-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 的子目錄中。

如此處所述您可以使用systemctl edit php-fpm.service並添加需要寫訪問權限的路徑來覆蓋它:

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

引用自:https://serverfault.com/questions/1094260