Я пытаюсь настроить nextcloud на RaspberryPi 3 под управлением Arch Linux (сигнализация) в течение недели.
Я установил apache, php с php-fpm, postgresql и установил nextcloud-testing из AUR (потому что nextcloud 17 не поддерживает php 7.4).
веб-корневой каталог apache находится по адресу /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
-предупреждение для /usr/share/webapps/nextcloud
Я подозреваю, что установлен параметр безопасности или поведение по умолчанию для arch, apache, php, php-fpm или чего-то еще, чтобы ограничить доступ для записи php к /srv/http
, но я не могу понять, какой параметр и как включить /usr/share/webapps/nextcloud
.
Думаю, я мог бы перейти к следующему облаку /srv/http/
, но я бы предпочел сделать это правильно, чтобы не нарушать обновления пакетов и другие вещи.
Итак, вопрос в том, как я могу разрешить php создавать файлы в /usr/share/webapps/nextcloud
?
Редактировать: Спасибо Nover за ответ. Это действительно было причиной отказа в доступе. Вместо перемещения следующего экземпляра облака или снятия ограничения безопасности 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
).
Обратите внимание, что эта строка в службе была создана в целях безопасности, поэтому вы можете подвергнуться атаке.