PHP - readfile() не успя да отвори поток: Разрешението е отказано - но защо?

Имам Ubuntu 16.04 с Apache2 и php7 на него. Не искам да чета някои лог файлове с php и да ги отпечатвам. Затова правя просто

readfile("/var/log/apache2/access.log");

Но това не работи. Получавам тази грешка:

Warning: readfile(/var/log/apache2/access.log): failed to open stream: Permission denied in /var/www/test.php on line 2

Съвсем сигурен съм, че съм задал правата правилно, Apache и php работят като www-данни, така че добавих потребителските www-данни към групите „adm“ и „syslog“, тъй като тези групи имат разрешения за четене за цялото път на файла и самия файл. Разрешенията са 640 по подразбиране, но само ако го задам на 647 например, файлът е четлив за php/apache. Дори 644 или 646 не са достатъчни.

Защо така? Трябва ли да променя нещо в конфигурацията на Apache vhost?

Добавяне: ls -alp /var/log/apache2

drw-r----- 2 root adm     4096 Oct 25 11:07 ./
drwxr-xr-x 9 root syslog  4096 Oct 25 10:39 ../
-rw-r----- 1 root adm    47861 Oct 25 14:01 access.log
-rw-r----- 1 root adm    12014 Oct 25 14:01 error.log
-rw-r----- 1 root adm        0 Oct 25 10:40 other_vhosts_access.log

person lemon    schedule 25.10.2017    source източник
comment
Моля, добавете това към въпроса: cd /var/log/apache2; ls -алп   -  person Nic3500    schedule 25.10.2017
comment
@Tenbo: той вече каза, че 647 е добре. Изглежда, че има нужда от o=rwx, за да прочете файла, което е странно. Ето защо го помолих да публикува ls -alp на /var/log/apache2.   -  person Nic3500    schedule 25.10.2017
comment
@Nic добави към моя начален пост   -  person lemon    schedule 25.10.2017


Отговори (1)


Тъй като това очевидно е грешка в разрешенията, уверете се, че всяка родителска папка, водеща до access.log, определено има група, зададена на adm или syslog.

Всяка папка, водеща до access.log, трябва да има поне групово разрешение за четене и изпълнение (g+rx), за да позволи на PHP да се спусне във всяка поддиректория.


Ако бях на ваше място, щях да променя конфигурацията на apache, за да запише файла в публично недостъпна папка във вашия уеб корен (тъй като регистрационният файл е очевидно важен за вашето приложение). Това ви спестява от промяна на разрешенията за системни папки, което може да бъде опасно, особено в уеб приложенията.

person Tenbo    schedule 25.10.2017
comment
БЛАГОДАРЯ! Една папка нямаше разрешения за изпълнение за групата. - person lemon; 25.10.2017