services.json не удалось открыть поток: в Laravel 4 отказано в разрешении

Я играл с работающей установкой Laravel 4 и переместил все в подпапку. Тогда я решил не делать этого и переместил все обратно (все через командную строку):

mv * /folder

а потом

cd folder
mv * ../

Теперь сайт выдает следующую ошибку:

file_put_contents(/var/www/quantquote/app/storage/meta/services.json): failed to open stream: Permission denied

Вот скриншот полной ошибки:

https://i.imgur.com/8deGG97.png

Я уже пытался установить разрешения для папки / storage на 777, но безрезультатно.


person JasonStockman    schedule 30.07.2013    source источник
comment
chmod -R 0777 app/storage должно быть хорошо ...   -  person Andreyco    schedule 30.07.2013
comment
Попробовал еще раз, и это не повлияло :(   -  person JasonStockman    schedule 30.07.2013
comment
Попробуйте запустить одновременно find app/storage -type d -exec chmod 777 {} \; и find app/storage -type f -exec chmod 777 {} \;   -  person Collin Henderson    schedule 31.07.2013
comment
@CollinHenderson, который сделал это, спасибо. вы можете объяснить, что это было?   -  person JasonStockman    schedule 31.07.2013
comment
Эти команды изменили права доступа всех каталогов и файлов в app/storage на 777.   -  person Rubens Mariuzzo    schedule 31.07.2013
comment
@RubensMariuzzo правильно. Я собираюсь скопировать это в правильный ответ, если вы хотите его принять.   -  person Collin Henderson    schedule 31.07.2013
comment
Простите мою наивность, но не следует ли избегать предоставления всем привилегий чтения, записи и выполнения в этом каталоге? Зависит ли пользователь, которому нужен доступ к этому месту, от владельца программы php?   -  person Spencer Williams    schedule 27.11.2013
comment
установка разрешений папки на 777 может вызвать проблемы с безопасностью. Вместо этого подумайте об изменении его на 775, чтобы запретить другим пользователям доступ на запись.   -  person eaykin    schedule 22.05.2014
comment
Этот пост является правильным ответом на ваш вопрос [Permission denied in Laravel 4] [1] [1]: stackoverflow.com/questions/14345174/   -  person Sam Arul Raj T    schedule 11.11.2014


Ответы (8)


На решение этой проблемы потратил целый день, и эта команда просто решила мою проблему.

Если ваши разрешения 777 для папки приложения Laravel, но вы все еще получаете эту ошибку, это потому, что SEliux заблокировал это. Вы можете легко разблокировать папку вашего приложения с помощью этой команды:

su -c "chcon -R -h -t httpd_sys_script_rw_t /usr/share/nginx/YOUR_LARAVEL_APP/"

Вот и все!

Кстати, никогда не отключайте SElinux: http://stopdishibitedselinux.com/

person Sky    schedule 09.12.2014
comment
Спасибо! Я хотел бы добавить, что моя команда оказалась chcon -R -h -t httpd_sys_script_rw_t /var/www/laravel, так как я уже нахожусь на локальной машине, работающей как root, на случай, если кто-то еще не спит и не читает вещи правильно. Еще раз спасибо! - person maggiekh; 18.05.2015
comment
Это ответ на многие вопросы о Laravel и ведении журнала. Спасибо за это. Сохранен еще один день отладки - person prog_24; 01.02.2016

Как я сказал в своем комментарии:

find app/storage -type d -exec chmod 777 {} \;

find app/storage -type f -exec chmod 777 {} \;

Это приведет к изменению всех каталогов и файлов в app/storage на 777.

person Collin Henderson    schedule 31.07.2013
comment
Я бы установил разрешения на 775 вместо 777 и соответствующим образом настроил права собственности на файлы и группы. т.е. группа веб-сервера и папка приложения / хранилища будут одинаковыми. - person eaykin; 22.05.2014
comment
В качестве меры безопасности я бы рекомендовал chmod -R ug+rwX,o-rwx . Это установит каталоги только для выполнения и не позволит людям за пределами группы делать ужасные вещи с вашими файлами. - person DanielM; 01.12.2014
comment
Чтобы узнать, как правильно установить права доступа к каталогу, проверьте этот ответ: stackoverflow.com/a/37266353/987864 - person Daan; 13.10.2016

Поскольку проблема связана с разрешениями, попробуйте повторно предоставить правильные разрешения для app/storage и всех его подкаталогов и файла.

Вы можете сделать это из корневого пути вашего приложения Laravel, набрав:

chmod -Rvc 777 app/storage

Если по какой-то причине это не сработает, попробуйте:

find app/storage -type d -exec chmod -vc 777 {} \;
find app/storage -type f -exec chmod -vc 777 {} \;
person Rubens Mariuzzo    schedule 31.07.2013
comment
Пожалуйста, если вы проголосуете против этого ответа, дайте объяснение, чтобы мы могли его улучшить. Спасибо. - person Rubens Mariuzzo; 07.09.2015
comment
Голос против: никогда не используйте chmod 777! Предложение такой опасной команды в качестве решения должно быть запрещено SO. - person Елин Й.; 13.01.2017
comment
@ ЕлинЙ. что бы вы порекомендовали вместо этого? - person Rubens Mariuzzo; 13.01.2017

Если вы используете CentOS7, выполните следующие действия:

  1. Изменить владельца каталога приложения / хранилища

    chown apache:apache app/storage
    
  2. Изменить разрешения приложения / хранилища

    chmod -R 775 app/storage
    
  3. Запретить SELinux блокировать каталог приложения / хранилища

    su -c "chcon -R -h -t httpd_sys_script_rw_t [fullpath]/app/storage"
    
person Eric Estrada Gómez    schedule 09.04.2015

Когда chmod 777 или chmod 775 не работают, проверьте, действительно ли существуют подкаталоги:

app/storage/
├── cache
├── logs
├── meta
├── sessions
└── views

в случае, если этих папок не существует, вы должны создать их:

cd app/storage/
mkdir meta logs cache sessions views
cd ../
find storage -type d -exec chmod 775 {} \;
find storage -type f -exec chmod 664 {} \;

ОБНОВЛЕНИЕ 2016 для laravel 5+

В структуре приложения Laravel 5+ по умолчанию storage находится на том же уровне, что и app. Таким образом, предыдущая команда выглядит так:

cd storage/
mkdir meta logs cache sessions views
find . -type d -exec chmod 775 {} \;
find . -type f -exec chmod 664 {} \;

https://laravel.com/docs/5.0/structure

person Igor Parra    schedule 16.08.2014
comment
Этот ответ мне помог, мне нужно было создать структуру папок в папке хранилища. Но в моем случае (для Laravel 5.0) папки представлений, сеансов и кешей должны были находиться в подпапке с именем framework. - person BruceHill; 22.01.2016

просто введите это на терминале:

php artisan cache:clear
person AmirAgha    schedule 10.11.2015
comment
Спас мою жизнь. -_- - person ssi-anik; 03.05.2016


Попробуйте эти команды одну за другой:

setenforce 0
setsebool -P httpd_can_network_connect_db on
person Mahendra Parab    schedule 14.11.2016
comment
Почему нет голосов за это? Это работает как шарм! : D спасибо! - person Ram Guiao; 31.07.2017
comment
Потому что он отключает SELinux вместо того, чтобы научиться его использовать, что является опасным советом. Кроме того, плакат фактически не объяснил, что делает это «решение». - person charliefortune; 21.11.2019