Як виправити помилку: не вдалося відкрити 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
Ryan LaB

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

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

13
Ті хлопці, які пропонують 777, спробуйте в Google цю фразу: "виробництво файлу db_password: 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

для використання апаша:

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 - це єдине, що працює
Matt D

3
@MattD Я думаю, що група apache на Mac - це _wwwспробувати це sudo chgrp -R _www bootstrap/cache. було б корисно поглянути на цей пост: stackoverflow.com/a/6419695/2125114
Хамід Parchami

3
Це має бути обрана відповідь, 100% погоджуються, що сисадміни не повинні просто дозволяти доступ до всього, щоб уникнути розробки справжнього питання.
HyperionX

134

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

chmod -R 775 storage

Засоби

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

Якщо ваш веб-сервер не працює як Vagrant, він не зможе записати на нього, тому у вас є два варіанти:

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
Matt D

57

Щоб виправити цю проблему, потрібно змінити право власності на каталог на користувача Unix, який використовує веб-сервер.

  1. Вийдіть із ВМ
  2. За допомогою консолі перейдіть до синхронізованої папки (бродячий)
  3. sudo chown -R $ USER: зберігання даних www
  4. chmod -R 775 зберігання

Хоча я створив проект у ВМ за допомогою користувача VM, папка належала користувачеві в реальному комп'ютері; так, при спробі

Зараз це працює.

Дякую всім, хто допоміг мені зрозуміти цю річ

Редагувати:

Насправді, вона все ще не працювала, все ж дала мені проблему "відмовлено у дозволі".

Ось що я зробив, я змінив свій 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, оскільки я використовую садибу, як я можу виправити цю проблему?
oleynikd

21
Ви не повинні користуватися 777 всім невольно.
IIllIIll

Я не бачу проблем із використанням 777 у папці, я точно знаю, що всередині (макетний зразок проекту)
Пн.

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
Turan Zamanlı

дивні речі, які я коли-небудь бачив, чому, до біса, це працює після пошуку понад 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 призначений для обмеження доступу навіть до кореневих користувачів, тому можна отримати доступ лише до необхідних матеріалів, принаймні на загальному огляді, це додаткова безпека, дезактивація не є хорошою практикою, є багато посилань на вивчення Selinux, але для цього якщо це навіть не потрібно.


Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться. - З огляду
Патрік Мевзек

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

Бути явною чи ні, це не проблема. Ідея цього сайту полягає в тому, що він містить всю релевантну інформацію, тому, прочитавши відповідь, ми отримуємо її всю. Зовнішні посилання можуть загнивати, і тоді відповідь стає марною. Це пояснюється у довідковому центрі за адресою stackoverflow.com/help/how-to-answer : " Закликаються посилання на зовнішні ресурси, але будь ласка, додайте контекст навколо посилання, щоб ваші колеги користувачі мали уявлення про те, що це таке і чому воно існує . Завжди цитуйте найбільш релевантну частину важливого посилання, на випадок, якщо цільовий сайт недоступний або постійно перебуває в режимі офлайн ".
Патрік Мевзек

Ваше запитання було позначено для ознайомлення, тобто все. І це суперечить тому, що написано в Довідковому центрі, що я цитував. Усі відповіді за допомогою лише посилання та жодних описів знімаються та навіть видаляються. Сміливо редагуйте свою відповідь, щоб надати тут відповідну частину пояснення. І ви вільні себе спростувати всі відповіді, які ви вважаєте поганими. З посилання на огляд видно, що я не був один, рекомендуючи закрити вашу відповідь. Не з технічних достоїнств, лише тому, що посилання недостатньо.
Патрік Мевзек

Дякую за роз’яснення, я не знав, що існують ці вказівки, або навіть якщо під час реєстрації ви отримаєте пораду для читання ресурсів, я не пам’ятаю цього. Те, що ви сказали, може бути правдою, посилання може загнивати, але відповідь можна отримати без зусиль, незалежно, я її відредагую.
Даніель Сантос

6

Якщо ви використовуєте cmd

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

Якщо ви використовуєте GUI

Спочатку перейдіть до проекту та клацніть правою кнопкою миші на сховищі та перевірте властивості та перейдіть на вкладку Дозволи

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

Змініть дозволи, використовуючи наведений нижче код

sudo chmod -R 777 storage

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

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

Потім перевірте свої налаштування та виконайте команду laravel, що вона буде працювати :)


Дякую yoouuuuuu
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 storage / logs chmod -R -777 storage / frame для вищезазначених папок 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. setenforce 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

Було це питання і знайшло це, і воно вирішило це питання.

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


-1

Цю помилку можна виправити, відключивши Linux.

Перевірте, чи він увімкнено

сестатус

Ти спробуй..

setenforce 0


5
"відключенням Linux "? Це серйозно надто далеко :-)!
Патрік Мевзек

-1

Для цієї помилки:

Помилка в обробці винятків: Потік або файл "/var/www/laravel/app/storage/logs/laravel.log" не вдалося відкрити: не вдалося відкрити потік: дозволу відмовлено в / var / www / laravel / bootstrap / скомпільовано .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.