Подтвердить что ты не робот

Centos 7/Apache/PHP - mkdir(): разрешение отклонено

Прежде чем орать DUPLICATE! и изгоняй меня в пропасть, выслушай меня.:)

Я разрабатываю сайт интрасети для компании, с которой я работаю, и изначально я разрабатывал ее непосредственно с моей рабочей станции с помощью Windows 7/IIS. Поскольку я приблизился к завершению сайта/приложений, мне был предоставлен Centos 7, в котором используется Apache, поэтому я начал процесс переноса на этот система. Я разобрался с большинством второстепенных вопросов, и теперь сайт работает. Тем не менее, есть часть сайта, который взаимодействует с нашей базой данных и создает каталог/файл журнала на основе того, кто вошел в систему. Эта часть использует функцию mkdir(), но я получаю с ней проблемы с правами.

mkdir(): Permission denied

Вот что я уже сделал:

  • Поскольку я использую Centos 7, пользователь/группа Apache - apache: apache. Я использовал chown и изменил владельца/var/www/html/и Logs папке для пользователя/группы apache. Чтобы быть в безопасности, я дважды проверил httpd.conf, а также проверил запущенные процессы, чтобы убедиться, что у меня есть правильный пользователь/группа.
  • Я попытался, просто для тестирования, изменить разрешения всех этих папок на chmod 777, но получить ту же ошибку.
  • Искал StackOverflow сверху вниз и получал ответы только на то, что я уже пробовал, но безрезультатно.

Итак, использую ли я chmod или chown для изменения разрешений для папок, к которым вы обращаетесь, я получаю тот же тип ошибки. Чтобы быть в безопасности, я также проверил пользователя PHP, и он также использовал пользователя apache.

Если у кого-то есть дополнительная информация о том, почему он не работает, даже если изменения будут изменены, пожалуйста, просветите меня. Если мне не удалось пропустить одну статью, объясняющую эту конкретную ситуацию, тогда орать дублируйте и изгоните меня в пропасть. lol:)


ИЗМЕНИТЬ Хорошо, поэтому при дальнейшем тестировании я обнаружил 2 проблемы, которые, как представляется, вызывают эту общую проблему.

  • PHP пытается установить разрешения для папки при создании из script, и, похоже, серверу это не нравится, даже если apache является владельцем. После удаления этой части кода ошибка разрешений исчезает, и я получаю сообщение об ошибке "no такой файл или каталог".
  • При тестировании создания каталогов с помощью Apache через sudo он смог создать каталог без проблем. Однако мой PHP script создает 2 каталога, а затем файл журнала в последнем созданном. Кажется, что вы не можете одновременно создавать два каталога? Например, существует уже созданная папка журналов, и PHP пытается создать под ней два каталога, один для идентификатора пользователя, а затем другую папку внутри этой даты с датой. Поэтому, когда запускается PHP скрипт, он должен создать что-то вроде "Logs/5235/3-3-2015/"

Только для того, чтобы заметить, я попытался установить рекурсивное значение true на mkdir в PHP, но это, когда я получаю проблемы с правами, которые были первоначально отмечены. Когда рекурсивный/режим удален, он не получает проблему разрешения, но не может создавать вложенные каталоги.


EDIT2

Чтобы проверить мои теории, я удалил вложенность и попытался создать mkdir только один каталог, и он генерирует те же ошибки, что и раньше. Хотя он принадлежал Apache, и даже если я установил его на 777, он отбрасывает разрешения.

4b9b3361

Ответ 1

Может быть, хотя у вас есть разрешения 755/777, SELinux блокирует httpd от записи/создания dirs.

Try:

chcon -R -t httpd_sys_content_t /path/to/www
chcon -R -t httpd_sys_content_rw_t /path/to/www/dir/for/rw

Дополнительная информация: http://wiki.centos.org/TipsAndTricks/SelinuxBooleans

Ответ 2

Не уверен, но ваши двоичные файлы Centos PHP могут нарушать права доступа к файлам. Есть два способа исправить это.

  • Компиляция PHP с нуля. Я бы предпочел это, потому что весь контроль будет вашим.
  • Или изменение вашего php script для использования функции Umask() PHP. Ссылка документации

Ответ 3

В соответствии с ответом DRU

Эти проблемы возникают из-за SELINUX. Используйте следующую команду

chcon -R -t httpd_sys_content_rw_t/path/to/www/dir/for/rw