Я занимаюсь переносом пары блогов Wordpress на AWS и столкнулся с проблемой с правами доступа к файлам, которая помешала мне в последние пару часов.
Простейший возможный вызов fopen всегда завершается ошибкой «не удалось открыть поток: в доступе отказано»:
<?php $handle = fopen('test.txt', 'w') or die('Can\'t open file'); ?>
Я пробовал / проверял следующее
Что я упустил, что могло вызвать это? Я подозреваю, что смотрю на это так долго, что упускаю что-то очевидное.
Обновить: После применения предложения Уомбла Я начинаю думать, что эта проблема более гнусная, чем просто плохие разрешения или неправильная конфигурация PHP. Мне удалось получить приведенный выше код для записи файла, однако, несмотря на то, что сценарий PHP выполнялся с правильным пользователем и группировкой, владельцы и группа результирующих файлов были установлены на apache. Если я выполню тот же тестовый сценарий из командной строки, у выпущенного файла будут правильные разрешения. Это заставляет меня думать, что это проблема с использованием mod_suexec.
Редактировать: Мое использование getmyuid () и getmygid () неверны, поскольку они возвращают только пользователя и группу файла сценария, а не разрешения, с которыми он работает. Более правильный подход - использовать что-то вроде этого:
<?php echo exec('ps -up '.getmypid()); ?>
Хороший вопрос - показывает, что вы сделали домашнее задание.
Я не могу придумать ничего «очевидного», что вы не смогли бы проверить, поэтому могу дать вам только более сложные советы по отладке.
strace
о процессе PHP и посмотрите, что именно он делает под капотом.fopen(..., 'r')
чтобы трижды проверить, что у вашего дерева каталогов на самом деле все в порядке.su
соответствующему пользователю и попробуйте сделать что-нибудь в командной строке. Если это сработает, тогда вы знать ваш сценарий не работает с разрешениями, которые вы думаете.getfacl
инструмент для использования). Это необычно, но время от времени они подпрыгивают и отрывают вам лицо. Если у вас есть ACL, используйте setfacl -x
чтобы избавиться от них, как только вы убедитесь, что они не нужны.Проверьте, что это за домашняя папка apache (обычно это /var/www
) и поместите файлы в эту папку, а затем дайте необходимые разрешения. Измените папку загрузки php temp на это. Это работает для меня.
пытаться /usr/sbin/apachectl -t -D DUMP_MODULES
проверьте, что все модули включены
Если вы получите
Warning: SuexecUserGroup directive requires SUEXEC wrapper.
разрешение
Такое предупреждение обычно вызвано недопустимыми разрешениями на оболочку suexec, оно должно быть:
# ls -la /usr/sbin/suexec
-rwsr-xr-x 1 root root 12064 2008-04-17 01:15 /usr/sbin/suexec
Если разрешения или права собственности отличаются от приведенного выше примера, используйте следующие команды, чтобы исправить их:
# chown root:root /usr/sbin/suexec
# chmod 4755 /usr/sbin/suexec
после этого исправления все было в порядке.
2 вещи.