Столкнулся со следующей проблемой:
- на моей VPS при попытке выполнения скрипта PHP команда fopen в момент создания файла выдала ошибку уровня Warning:
Warning: fopen() [function.fopen]: failed to open stream: Permission denied in index_test.php on line 21
То есть, переводя на русский - не хватает прав для создания (записи) файла.
Причина проста - хотя для решения пришлось порыться.
Итак, причина кроется в следующем:
- сервер Apache (и модуль PHP) выполняются от имени пользователя www-data
- но папки виртуального хоста (сайта для конкретного домена) создавались в ssh из-под пользователя root
То есть, владельцем папки и всех файлов внутри является root, а права на папку установлены как 755 (то есть, писать в неё может только владелец).
Некоторые советуют в таких случаях ставить права 777 на папку и всё что внутри - но это неправильно, так как при этом уменьшается безопасность сайта.
Итого, самым простым решением оказалось сменить владельца папки и всего что внутри на www-data, при этом права доступа по прежнему остались 755.
1. Заходим в нужную нам папку, где лежит виртуальный хост.
2. Даём команду
ls -l
чтобы посмотреть владельца и группу. Получаем что-то вроде
total 8
drwxr-xr-x 2 root root 4096 Nov 22 11:05 public
drwxr-xr-x 5 root root 4096 Nov 22 11:49 sys
Выделенный полужирным (первый root) - это владелец. Второй root - это группа пользователей, назначенная для данных папок/файлов.
3. Смотрим, от имени какого пользователя исполняется Apache. Это можно сделать, дав команду
ps aux
а затем поискав в списке всех процессор Apache. Но чтобы искать было проще, даём команду
ps aux | grep -iE '(https|php|apache)'
Если точнее - это цепочка команда. Вторая (grep) отфильтрует вывод, и покажет то, что нам нужно. Так как в разных версиях Linux / UNIX процессы могут называться по разному, мы ищем сразу все подходящие.
В результате получим примерно такое:
www-data 26158 0.0 1.6 36256 8364 S 10:11 0:00 /usr/sbin/apache2 -k start
www-data 26817 0.0 1.6 36308 8348 S 11:32 0:00 /usr/sbin/apache2 -k start
www-data 26831 0.0 1.4 36256 7576 S 11:38 0:00 /usr/sbin/apache2 -k start
(Первый запуск может быть от имени root, мы же ищем запуски основных процессов apache).
В первой колонке - пользователь, от имени которого запущен процесс. Видим, что это www-data.
4. Меняем пользователя нужным нам папкам и файлам. Для этого используем команду
chown
В моём случае, когда я находился в папке, описывающей нужный виртуальный хост (домен), я задал команду
sudo chown -R www-data *
Расшифрую по пунктам:
- sudo - выполннить от имени root (т.к. владелец root, а я работаю по ssh не под root'ом)
- chown -R - сменить владельца, причём рекурсивно для всех вложенных ресурсов
- www-data - имя нового владельца
- * - для всех папок/файлов, что находятся там, где я отдаю команду (ну и -R выполняет это рекурсивно вглубь)
Если надо - перед сменой владельца почитайте подробнее о команде chown.
- на моей VPS при попытке выполнения скрипта PHP команда fopen в момент создания файла выдала ошибку уровня Warning:
Warning: fopen() [function.fopen]: failed to open stream: Permission denied in index_test.php on line 21
То есть, переводя на русский - не хватает прав для создания (записи) файла.
Причина проста - хотя для решения пришлось порыться.
Итак, причина кроется в следующем:
- сервер Apache (и модуль PHP) выполняются от имени пользователя www-data
- но папки виртуального хоста (сайта для конкретного домена) создавались в ssh из-под пользователя root
То есть, владельцем папки и всех файлов внутри является root, а права на папку установлены как 755 (то есть, писать в неё может только владелец).
Некоторые советуют в таких случаях ставить права 777 на папку и всё что внутри - но это неправильно, так как при этом уменьшается безопасность сайта.
Итого, самым простым решением оказалось сменить владельца папки и всего что внутри на www-data, при этом права доступа по прежнему остались 755.
Сам же поиск и решение выглядел так (работал по ssh, не под root'ом):
1. Заходим в нужную нам папку, где лежит виртуальный хост.
2. Даём команду
ls -l
чтобы посмотреть владельца и группу. Получаем что-то вроде
total 8
drwxr-xr-x 2 root root 4096 Nov 22 11:05 public
drwxr-xr-x 5 root root 4096 Nov 22 11:49 sys
Выделенный полужирным (первый root) - это владелец. Второй root - это группа пользователей, назначенная для данных папок/файлов.
3. Смотрим, от имени какого пользователя исполняется Apache. Это можно сделать, дав команду
ps aux
а затем поискав в списке всех процессор Apache. Но чтобы искать было проще, даём команду
ps aux | grep -iE '(https|php|apache)'
Если точнее - это цепочка команда. Вторая (grep) отфильтрует вывод, и покажет то, что нам нужно. Так как в разных версиях Linux / UNIX процессы могут называться по разному, мы ищем сразу все подходящие.
В результате получим примерно такое:
www-data 26158 0.0 1.6 36256 8364 S 10:11 0:00 /usr/sbin/apache2 -k start
www-data 26817 0.0 1.6 36308 8348 S 11:32 0:00 /usr/sbin/apache2 -k start
www-data 26831 0.0 1.4 36256 7576 S 11:38 0:00 /usr/sbin/apache2 -k start
(Первый запуск может быть от имени root, мы же ищем запуски основных процессов apache).
В первой колонке - пользователь, от имени которого запущен процесс. Видим, что это www-data.
4. Меняем пользователя нужным нам папкам и файлам. Для этого используем команду
chown
В моём случае, когда я находился в папке, описывающей нужный виртуальный хост (домен), я задал команду
sudo chown -R www-data *
Расшифрую по пунктам:
- sudo - выполннить от имени root (т.к. владелец root, а я работаю по ssh не под root'ом)
- chown -R - сменить владельца, причём рекурсивно для всех вложенных ресурсов
- www-data - имя нового владельца
- * - для всех папок/файлов, что находятся там, где я отдаю команду (ну и -R выполняет это рекурсивно вглубь)
Если надо - перед сменой владельца почитайте подробнее о команде chown.
Привет!
ОтветитьУдалитьА если линукс как рабочая станция. У меня есть пользователь user, под которым я создаю сайт в папке /var/www/site1. Для того, чтобы апач+пхп "нормально воспринимали" я должен сделать смену пользователя на www-data, но потом я же не смогу редактировать свои файлы. Что думаете по этому поводу, запускать апач от имени user?
Есть альтернативный вариант - он чуть сложнее. Его суть - использовать группы пользователей. Надо создать группу - скажем, www-data (или с другим именем), и в неё включить юзеров www-data и user (ну и других, каких надо; отмечу, что один пользователь может входить сразу в несколько групп).
УдалитьЗатем для нужной папки/папок надо поменять группу И настроить правильные права доступа для группы (так как теперь наши права для данной папки будут определяться именно через права доступа группы, владельцем же может остаться даже root).
Про основы работы с группами можно прочитать здесь - http://help.ubuntu.ru/wiki/%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B