Вчера я потратил 5 часов подряд на обнаружение, казалось бы, необоснованной ошибки "не удалось открыть поток. Отказано в доступе", которая происходила после любых операций записи в файловую систему: fopen (с флагами "w" и "a"), move_uploaded_file, file_put_contents.
Я много раз перепроверял владельцев каталогов (пользователь и группа - chown, chgrp), менял атрибуты папки на незащищенный 777 (rwx с chmod
), но это не дало результата. Я даже переустановил Apache и PHP, но все равно столкнулся с той же ошибкой.
Как выяснилось после нескольких часов чтения различной документации, причиной ошибки были ограничения SELinux, автоматически применяемые для службы Apache httpd. Я просто отключил SELinux, отредактировав файл /etc/selinux/config
в моей Fedora (выпуск 20), изменив строку:
SELINUX=enforcing
to
SELINUX=disabled
Я перезагрузил компьютер, и эта досадная ошибка наконец исчезла.
Я должен заметить, что все вопросы в Stack Overflow, касающиеся проблемы «отказа в доступе» в среде LAMP, касались только проблем с правами доступа к папке, чего не было в моем случае.
(практически) Как предоставить службе Apache httpd разрешения на запись, удаление и обновление каталога без полного отключения SELinux?
(теоретическая) Что такое SELinux? Для чего он предназначен? Почему (для чего) он был создан? Почему я должен использовать его? Есть ли причина оставлять SElinux включенным на локальной машине разработчика?
исключительно модераторам ресурса: я знаю, что эта проблема затрагивает больше администрирование, чем реальное программирование, но я уверен, что она затрагивает разработчиков гораздо сильнее, чем, скажем, начинающих администраторов, поэтому выбирая между SuperUser и StackOverflow, я выбрал последнее . Однако вам решать, переместить вопрос в SuperUser или оставить на этом месте.