嘗試使用 php 在 webroot 外部創建文件時出現“無法打開流:只讀文件系統”
我正在嘗試在執行 arch linux(警報)的 RaspberryPi 3 上設置 nextcloud 一個星期。
我已經設置了 apache、php 和 php-fpm、postgresql 並從 AUR 安裝了 nextcloud-testing(因為 nextcloud 17 不支持 php 7.4)。
apache 的 webroot 位於
/srv/http
但 nextcloud 安裝到/usr/share/webapps/nextcloud
.我的虛擬主機:
<VirtualHost *:443> DocumentRoot "/srv/http" <Directory "/srv/http"> Options FollowSymLinks AllowOverride None Require all granted </Directory> ... #ssl stuff ... ScriptAlias /cgi-bin/ "/srv/http/cgi-bin/" <Directory "/srv/http/cgi-bin"> AllowOverride None Options None Require all granted </Directory> Alias /nextcloud /usr/share/webapps/nextcloud/ <Directory /usr/share/webapps/nextcloud> Options FollowSymlinks AllowOverride all Require all granted </Directory> </VirtualHost>
在瀏覽器中訪問
https://mydomain/nextcloud
時,錯誤消息是無法寫入配置目錄。檢查這個的 php 程式碼使用is_writable()
,所以為了調試這個我試過(我會在這個工作之後再次加強安全性):
chown -R http:http /usr/share/webapps/nextcloud
chmod -R 777 /usr/share/webapps/nextcloud
- 目錄
/usr/share/webapps
,/usr/share
並對/usr
其他人擁有 x 權限sestatus
返回command not found
su -s /bin/bash http
,然後echo test > /usr/share/webapps/nextcloud/test.txt
工作- 設置
open_basedir = /
並/etc/php/php.ini
重新啟動php-fpm
沒有幫助我創建了
/srv/http/test.php
:<?php echo "username: ", exec('whoami'), "<br/>"; echo "open_basedir: ", var_dump(ini_get('open_basedir')), "<br/>"; $myfile = "/usr/share/webapps/nextcloud"; #$myfile = "/srv/http"; // checking permissions of the file $permissions = fileperms($myfile); $perm_value = sprintf("%o", $permissions); // Clearing the File Status Cache clearstatcache(); // checking whether the file is writable or not if(is_writable($myfile)) { echo "$myfile file is writable and it has the following file permissions : $perm_value", "<br/>"; } else { echo "$myfile file is not writable and it has the following file permissions : $perm_value", "<br/>"; } // Clearing the File Status Cache clearstatcache(); $fs = fopen($myfile . "/test.txt","w") or die("cannot fopen"); fwrite($fs,date(DATE_RSS)); fclose($fs); ?>
https://mydomain/test.php
節目username: http open_basedir: string(0) "" /usr/share/webapps/nextcloud file is not writable and it has the following file permissions : 40777 Warning: fopen(/usr/share/webapps/nextcloud/test.txt): failed to open stream: Read-only file system in /srv/http/test.php on line 30 cannot fopen
設置
$myfile = "/srv/http";
錯誤消息時,正如預期
Warning: fopen(/srv/http/test.txt): failed to open stream: Permission denied in /srv/http/test.php on line 30
的那樣
/srv/http
歸他人所有,root
並且沒有其他人的寫權限。當chmod o+w /srv/http
腳本輸出file is writable
目前日期並將其寫入/srv/http/test.txt
.由於
Read-only file system
-warning for/usr/share/webapps/nextcloud
我懷疑 arch、apache、php、php-fpm 或其他地方的安全設置或預設行為來限制 php 的寫訪問權限/srv/http
,但我無法弄清楚哪個設置以及如何包含/usr/share/webapps/nextcloud
.我想我可以將 nextcloud 移至
/srv/http/
,但我寧願以正確的方式這樣做,以免破壞包更新和其他事情。所以問題是我怎樣才能允許 php 在中創建文件
/usr/share/webapps/nextcloud
?編輯: 感謝Nover的回答。這確實是拒絕訪問的原因。我沒有移動 nextcloud-instance 或
ProtectSystem=full
通過註釋掉它來完全刪除安全限制,而是為 php-fpm.service 創建了一個systemctl edit php-fpm.service
包含以下內容的插入文件:[Service] ReadWritePaths=/etc/webapps/nextcloud/config /usr/share/webapps/nextcloud/apps /usr/share/webapps/nextcloud/data
我從以下連結中發現 Systemd
php-fpm
服務可能被配置為阻止對某些文件夾和子文件夾的任何寫入操作,並/usr
受此影響。您可能想像您提到的那樣移動 nextcloud 實例,或者您可能還想編輯 systemd 服務 (
/usr/lib/systemd/system/php-fpm.service
) 並註釋該行ProtectSystem=full
。您將需要重新啟動服務 (sudo systemctl restart php-fpm
)。請注意,服務中的這一行是出於安全目的,因此您可能會受到一些攻擊。