一周以来,我一直在尝试在运行 arch linux(alarm)的 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:
<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,/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
答案1
我从以下链接发现,Systemdphp-fpm
服务可能被配置为阻止对某些文件夹和子文件夹的任何写入操作,并/usr
受到此影响。
您可能想要按照您提到的那样移动 nextcloud 实例,或者您可能还想编辑 systemd 服务(/usr/lib/systemd/system/php-fpm.service
)并注释该行ProtectSystem=full
。您需要重新启动服务(sudo systemctl restart php-fpm
)。
请注意,服务中的这条线路是为了安全目的而设置的,因此您可能会遭受一些攻击。