Php
什麼會阻止 php-fpm (8.0.16) 能夠寫入 NFS 掛載的文件系統?
我有一個無法將文件寫入 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