Как исправить ошибку: laravel.log не может быть открыт?


186

На самом деле я довольно новичок в laravel и пытаюсь создать свой самый первый проект. по какой-то причине я продолжаю получать эту ошибку (я еще даже не начал кодировать)

Error in exception handler: The stream or file "/var/www/laravel/app/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied in /var/www/laravel/bootstrap/compiled.php:8423

Я читал, что это как-то связано с разрешениями, но chmod -R 775 storageне помогло вообще.

права доступа


Вы уверены, что находитесь в правильном каталоге при запуске этой команды chmod? Попробуйте chmod -R 755 / var / www / laravel / app / storage. Кроме того, на что настроены пользователь и группа? Попробуйте ls -al / var / www / laravel / app / storage
Райан ЛаБ

те же результаты (я обновил свой оригинальный пост, чтобы показать права доступа к папке)
FRR

: / по какой-то причине это все еще не работает. Я не упоминал об этом раньше, но я использую бродягу. поэтому моя папка www находится на виртуальной машине (на ней работает apache, php и все остальное). Я не уверен, что это как-то связано, но я решил упомянуть об этом на всякий случай. (Я создаю свой проект с помощью VM, используя композитор)
FRR

13
Те парни, которые предлагают 777, попробуйте гугл эту фразу: "production db_password filetype: env inurl: com"
Тарасович

1
Отключение SELINUX у меня сработало.
Пракаш П

Ответы:


307

Никогда не устанавливайте каталог на 777 . Вы должны изменить владельца каталога. поэтому установите текущего пользователя, с которым вы вошли как владелец, а пользователя веб-сервера (www-data, apache, ...) как группу. Вы можете попробовать это:

sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache

Затем, чтобы установить права доступа к каталогу, попробуйте это:

chmod -R 775 storage
chmod -R 775 bootstrap/cache

Обновить:

Пользователь и группа веб-сервера зависят от вашего веб-сервера и вашей ОС. Чтобы выяснить, кто ваш пользователь и группа на веб-сервере, используйте следующие команды. для использования nginx:

ps aux|grep nginx|grep -v grep

для использования Apache:

ps aux | egrep '(apache|httpd)'


4
Спасибо! Короче говоря, вы также можете сделать:sudo chown -R {your current user}:www-data storage bootstrap/cache
Рамеш Парик

2
@RameshPareek Вы правы, но я просто хотел быть более ясным;)
Хамид Парчами

1
Это не работает для меня. Я просто получаю chown: www-data: illegal group name. Установка каталога на 777 - единственное, что работает
Мэтт Д

3
@ MattD Я думаю, что группа apache на Mac, _wwwпопробуйте это sudo chgrp -R _www bootstrap/cache. было бы полезно взглянуть на этот пост: stackoverflow.com/a/6419695/2125114
Хамид Парчами

3
Это должен быть выбранный ответ, 100% согласны с тем, что системные администраторы не должны просто разрешать доступ ко всему, чтобы избежать решения реальной проблемы.
HyperionX

134

Никогда не используйте 777 для каталогов на вашем реальном сервере, но на вашем собственном компьютере, иногда нам нужно сделать больше, чем 775, потому что

chmod -R 775 storage

Средства

7 - Owner can write
7 - Group can write
5 - Others cannot write!

Если ваш веб-сервер не работает как Vagrant, он не сможет писать на него, поэтому у вас есть 2 варианта:

chmod -R 777 storage

или измените группу на пользователя вашего веб-сервера, предположив, что это www-data:

chown -R vagrant:www-data storage

В моем случае chmod не нужен, так как он уже установлен, но на Fedora 20 он был необходим:chown -R apache:apache laravelproject
misterjaytee

Были проблемы с монтированием папок через samba / vagrant - chown -R vagrant:www-data storageсделал это для меня, спасибо.
Льюис

1
У меня сработало хранилище chmod -R 777. Я попытался изменить группу, но я продолжал получатьwww-data: illegal group name
Мэтт D

58

Чтобы устранить эту проблему, необходимо изменить владельца каталога на пользователя unix, который использует веб-сервер.

  1. Выйти из ВМ
  2. Используя консоль, перейдите в синхронизируемую папку (vagrant)
  3. sudo chown -R $ USER: хранилище данных www
  4. хранилище chmod -R 775

Несмотря на то, что я создал проект в виртуальной машине, используя пользователя виртуальной машины, папка принадлежала пользователю на реальном компьютере; поэтому при попытке

Теперь это работает.

Спасибо всем, кто помог мне разобраться в этом

РЕДАКТИРОВАТЬ:

Фактически, это все еще не работало, это все еще дало мне проблему «отказано в разрешении».

Вот что я сделал, я изменил свой Vagrantfile следующим образом:

config.vm.synced_folder "./app","/var/www/", create:true,
:owner => "vagrant",
:group => "www-data",
:mount_options => ["dmode=775","fmode=664"]

Я сделал это ... и Я РОСТ! Все еще не работает ... laravel 5 ... переименовал файл журнала, laravel создал новый ... та же ошибка
ied3vil

1
У меня нет config.vm.synced_folder, потому что я использую hometead, как я могу решить эту проблему?
oleynikd

21
Вы не должны использовать 777 все волей и неволей.
IIllII

Я не вижу проблем с использованием 777 в папке, я точно знаю, что внутри (пример проекта-пустышки)
FRR

2
Это абсолютно не должно быть принятым ответом. Это ужасно. Никогда не устанавливайте 777. Всегда.
CGriffin

39

Это также может быть SELinux. (Centos, RedHat)

Определить статус SElinux на терминале:

$ sestatus

Если статус включен, напишите команду для отключения SElinux

$ setenforce Permissive

Или вы можете выполнить эту команду

$ sudo setenforce 0


6
Это единственное, что сработало, не могли бы вы объяснить, что он делает?
hack4mer

2
@ hack4mer вы можете прочитать больше информации о seLinux. en.wikipedia.org/wiki/Security-Enhanced_Linux
Туран Заманлы

странные вещи, которые я когда-либо видел, какого черта это работает после поиска более 6 часов
Мухаммад Юлианто

1
Единственное решение, которое сработало для меня .. спасибо. Но проблема возвращается каждый раз, когда сервер перезагружается, знаете ли вы, как его применить, даже если сервер был перезапущен?
Хуан Анхель

1
@JuanAngel вы должны навсегда отключить службу. откройте с помощью редактора vim / etc / sysconfig / selinux, а затем измените директиву SELinux = принудительно на SELinux = отключено
Turan Zamanlı

32

Вам необходимо настроить разрешения storageи bootstrap/cache.

  • cd в ваш проект Laravel.
  • sudo chmod -R 755 storage
  • sudo chmod -R 755 bootstrap/cache

Вы можете попробовать 777, если 755 не работает. 777 не безопасен, хотя!

В зависимости от того, как настроен ваш веб-сервер, вы можете быть более точными в своих разрешениях и предоставлять их только пользователю вашего веб-сервера. Google WEB SERVER NAME Laravel file permissionsдля получения дополнительной информации.

На момент написания статьи это для Laravel 5.4


14

добавить в composer.json

"scripts": {
    "post-install-cmd": [
          "chgrp -R www-data storage bootstrap/cache",
          "chmod -R ug+rwx storage bootstrap/cache"
     ]
}

После composer install


12

Запустите следующие команды, и вы можете добавить sudoв начале команды зависит от вашей системы:

chmod -R 775 storage/framework
chmod -R 775 storage/logs
chmod -R 775 bootstrap/cache 

1
Никогда не используйте 777. С разрешениями 777 вы даете всем, у кого есть подключение, полный доступ к файлам или каталогам с этими разрешениями. Они могут изменять их любым способом по своему усмотрению, в том числе злонамеренно. Многие случаи взлома аккаунтов происходят из 777 разрешений.
Одиссея

8

Для всех пользователей Centos 7 в контексте Laravel нет необходимости отключать Selinux, просто выполните следующие команды:

yum install policycoreutils-python -y # might not be necessary, try the below first

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/storage(/.*)?" # add a new httpd read write content to sellinux for the specific folder, -m for modify
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/bootstrap/cache(/.*)?" # same as the above for b/cache

restorecon -Rv /var/www/html/ # this command is very important to, it's like a restart to apply the new rules

Наконец, убедитесь, что ваши хосты, ips и виртуальные хосты правильно настроены для удаленного доступа.

Selinux предназначен для ограничения доступа даже для пользователей с правами root, поэтому можно получить доступ только к необходимым материалам, по крайней мере, из общего обзора, это дополнительная безопасность, отключение которой не является хорошей практикой, есть много ссылок, чтобы изучить Selinux, но для этого дело даже не требуется.


Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - Из обзора
Патрик Мевзек

Ссылка супер-явная, такой механизм не нужен, даже есть раздел специально для контекста Laravel SELinux. Я думаю, что ваше мнение должно быть подкреплено немного большей логикой, чем простым практическим правилом. Тем временем вы отклонили ответ, который, скорее всего, на 99% решит проблемы, не отказываясь от плохих практик, таких как отключение Selinux.
Даниэль Сантос

Это не проблема быть явным или нет. Идея этого сайта в том, что он содержит всю необходимую информацию, поэтому, читая ответ, мы получаем все это. Внешние ссылки могут гнить, и тогда ответ становится бесполезным. Это объясняется в справочном центре на stackoverflow.com/help/how-to-answer : «Ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели представление о том, что это такое и почему оно есть. . Всегда указывайте наиболее соответствующую часть важной связи, в случае , если целевой сайт недоступен или идет постоянно в автономном режиме. "
Патрик Mevzek

Ваш вопрос был помечен для просмотра, вот и все. И это противоречит тому, что написано в справочном центре, который я цитировал. Все ответы, содержащие только ссылку и описание, не принимаются и даже удаляются. Не стесняйтесь редактировать свой ответ, чтобы предоставить соответствующую часть объяснения здесь. И вы сами можете опровергнуть все ответы, которые вы считаете плохими. Из ссылки на обзор видно, что я был не одинок, когда рекомендовал закрыть ваш ответ. Не по техническим причинам, просто потому, что ссылки недостаточно.
Патрик Мевзек

Спасибо за разъяснения, я не знал, что такого рода руководящие принципы существовали, или даже если в процессе регистрации вы получите подсказку для чтения ресурсов, я не запомню это. То, что вы сказали, может быть правдой, ссылка может сгнить, но ответ может быть достигнут без усилий, независимо от того, я его отредактирую.
Даниэль Сантос

6

Если вы используете CMD

sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache

Если вы используете GUI

Сначала перейдите в проект и щелкните правой кнопкой мыши на хранилище и проверьте свойства и перейдите на вкладку Разрешения

введите описание изображения здесь

Измените разрешения, используя приведенный ниже код

sudo chmod -R 777 storage

Тогда ваши свойства файла могут быть

введите описание изображения здесь

Затем проверьте ваши настройки и выполните команду laravel, она будет работать :)


Спасибо, йоуууууу
viniciussvl

5

В Laravel вы должны включить ACL storageи cacheкаталог, чтобы пользователь веб-сервера мог читать / писать в каталоге. Откройте новый терминал и выполните следующее:

HTTPDUSER=$(ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1)

sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX bootstrap/cache storage/
sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX bootstrap/cache storage/

Ссылки:

https://symfony.com/doc/3.4/setup/file_permissions.html#using-acl-on-a-system-that-supports-setfacl-linux-bsd

https://linux.die.net/man/1/setfacl


5

Это может быть поздно, но может кому-то помочь, смена разрешений для каталогов сработала для меня.

Предполагая, что ваш проект Laravel находится в /var/www/html/каталоге. Перейти в этот каталог.

cd /var/www/html/

Затем измените разрешения storage/и bootstrap/cache/каталоги.

sudo chmod -R gu+w storage/
sudo chmod -R guo+w storage/
sudo chmod -R gu+w bootstrap/cache/
sudo chmod -R guo+w bootstrap/cache/

2

Это решение специально для Laravel 5.5

Вы должны изменить разрешения для нескольких папок: chmod -R -777 хранилище / журналы chmod -R -777 хранилище / framework для указанных выше папок 775 или 765 не работали для моего проекта

chmod -R 775 bootstrap/cache 

Также владение папкой проекта должно быть следующим (текущий пользователь) :( пользователь веб-сервера)



1

Я не слишком заинтересован в изменении разрешений для моей папки на 777. Вот как я решил эту проблему.

Сначала я изменил пользователя, который запускает веб-сервер на моей локальной машине (я запускаю nginx, но принципы применяются везде):

$> sudo vim /etc/nginx/nginx.conf
user <my_user> #inside nginx.conf
service nginx reload

После этого я создал еще один index.phpфайл в public/папке, чтобы узнать, кто запускает мою версию php-fpm и где я могу ее изменить:

<?php
phpinfo();
?>

Перезагрузив страницу, я обнаружил, что это www-dataбыл пользователь (в разделе среды). Я также узнал, что я использую php 7.1. Я приступил к смене пользователя:

$> sudo vim /etc/php/7.0/fpm/pool.d/www.conf 
#Look for www-data or the following variables: user, group, listen.user, listen.group.

Наконец, я дал следующие разрешения для папок:

sudo chmod -R 775 ./storage/

Теперь я удостоверился, что являюсь владельцем папок, используя простое:

ls -al

Если вы установите для себя пользователей сервера и php-fpm, а папки, к примеру, принадлежат пользователю root, то эта проблема будет продолжаться. Это может произойти, если вы сделали sudo laravel new <project>как root. В этом случае убедитесь, что вы используете рекурсивную chownкоманду в своем проекте для изменения user:groupнастроек. В большинстве случаев по умолчанию www-dataэто основной параметр для сервера и php, в этом случае необходимо убедиться, что папка находится внеwww-data досягаемости.

Мой проект настроен в моем домашнем каталоге. На Ubuntu 16.04 и Laravel 5.5.


1

попробуй это

  1. CD / VAR / WWW / HTML
  2. Сетенфорс 0
  3. перезапуск службы httpd

Не могли бы вы объяснить, что это делает?
Все более идиотский

1
Не нужно менять каталоги для использования, setenforceно в любом случае неправильно полностью отключать SELinux только для того, чтобы исправить одну проблему с разрешениями.
Патрик Мевзек

0

В моем конкретном случае у меня был сгенерирован конфигурационный файл, который кэшировался в bootstrap/cache/каталог, поэтому мои шаги, где:

  1. Удалить все созданные кэшированные файлы: rm bootstrap/cache/*.php
  2. Создайте новый laravel.logфайл и примените обновление разрешений для файла, используя:

    • chmod -R 775 storage

0

Ubuntu ): может быть решено в 2 простых шага:

$ sudo chmod -R 777 storage 

И

$ sudo service apache2 restart

Шаг 3: взломайте ваш сервер и / или пользователей, потому что вы открыли свои файлы для всего мира.
miken32

0

Удалите "/var/www/laravel/app/storage/logs/laravel.log"и попробуйте снова:

rm storage/logs/laravel.log



-1

Эту ошибку можно исправить, отключив Linux.

Проверьте, включен ли он

sestatus

Вы пытаетесь..

Сетенфорс 0


5
"отключив Linux "? Это серьезно заходит слишком далеко :-)!
Патрик Мевзек

-1

Для этой ошибки:

Ошибка в обработчике исключений: не удалось открыть поток или файл "/var/www/laravel/app/storage/logs/laravel.log": не удалось открыть поток: отказано в разрешении в / var / www / laravel / bootstrap / compiled .php: 8423

используйте эту команду в терминале:

sudo chmod -R 777 storage

2
слишком плохо для производства env
Ariful Haque

-1

Исправлена ​​проблема с этой командой на сервере Centos 7.6

chcon -R -t httpd_sys_content_t $SITE_PATH

chcon -R -t httpd_sys_rw_content_t $SITE_PATH
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.