Я установил httpd и php на свежий centos7 и поместил несколько файлов в / var / www / html, включая сценарий установки, который я написал. Этот сценарий необходимо записать в файл конфигурации в каталоге / var / www / html. Я создал пустой файл конфигурации и подключил его к apache: apache. Однако попытка открыть этот файл с доступом для записи всегда дает ошибку:
fopen(/var/www/html/config-local.php): failed to open stream: Permission denied
Во время исследования я прочитал эту цитату: «Чтобы получить доступ к файлу, ВСЕ родительские каталоги должны быть доступны для чтения». Я проверил, и они есть. /, / var, / var / www и / var / www / html доступны для чтения всем.
Так что здесь происходит? Похоже, что пользователь apache - это своего рода специально ограниченный пользователь, поскольку тестирование того же сценария со стандартным пользователем работает нормально.
Вероятно, это проблема с разрешениями SELinux. /var/log/audit/audit.log
должен суметь подтвердить.
Контекст SELinux, вероятно, system_u:object_r:httpd_sys_content_t:s0
, но должно быть system_u:object_r:httpd_sys_rw_content_t:s0
. Это можно изменить с помощью chcon
.
Я также не оптимистичен по поводу наличия файла конфигурации в DocumentRoot
вашего веб-сервера. Я могу ошибаться, поскольку вы не предоставили достаточно деталей, но это будет так, если вы не изменили значения по умолчанию.
Потратил много времени на поиск этого ответа, но он все по частям, и никто не публикует решение (ну, большую часть времени), так что вот мое решение, которое также используется на различных веб-панелях управления.
установить и использовать MOD_RUID2
Установите PHP с помощью CLI (это стандарт для более новых версий)
В вашем файле HTTPD.CONF на виртуальных хостах вы добавите следующее, заменив имя пользователя на имя пользователя и группу пользователей на группу пользователя (обычно это одно и то же)
<IfModule !mod_ruid2.c>
SuexecUserGroup username usergroup
</IfModule>
<IfModule mod_ruid2.c>
RMode config
RUidGid username usergroup
RGroups @none
</IfModule>
Пример конфигурации виртуального хоста:
<VirtualHost *:443>
DocumentRoot "/home/imtheuser/public_html"
ServerName imtheuser.com
<IfModule !mod_ruid2.c>
SuexecUserGroup imtheuser imtheuser
</IfModule>
<IfModule mod_ruid2.c>
RMode config
RUidGid imtheuser imtheuser
RGroups @none
</IfModule>
<Directory "/home/imtheuser/public_html">
allow from all
Options None
Require all granted
</Directory>
</VirtualHost>
Это позволит apache / php писать в каталог, принадлежащий пользователю. Это намного безопаснее, чем установить chmod на 0777.