Jak naprawić błąd: nie można otworzyć laravel.log?


186

Właściwie jestem całkiem nowy w laravel i próbuję stworzyć swój pierwszy projekt. z jakiegoś powodu ciągle otrzymuję ten błąd (jeszcze nie zacząłem kodować)

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

Czytałem, że ma to coś wspólnego z uprawnieniami, ale w chmod -R 775 storageogóle nie pomogło.

Uprawnienia


Czy na pewno jesteś we właściwym katalogu podczas wykonywania tego polecenia chmod? Spróbuj chmod -R 755 / var / www / laravel / app / storage. Jakie są ustawienia użytkownika i grupy? Wypróbuj ls -al / var / www / laravel / app / storage
Ryan LaB

te same wyniki (zaktualizowałem mój oryginalny post, aby pokazać uprawnienia do folderu)
FRR

: / z jakiegoś powodu nadal nie działa. Nie wspomniałem o tym wcześniej, ale używam włóczęgi. więc mój folder www znajduje się na maszynie wirtualnej (apache, php i wszystko inne działa na nim). Nie jestem pewien, czy to ma coś wspólnego z czymkolwiek, ale pomyślałem, że wspomnę o tym na wszelki wypadek. (Tworzę swój projekt z vm, używając kompozytora)
FRR

13
Ci faceci, którzy sugerują 777, spróbuj wygooglować w Google to wyrażenie: "produkcja db_password filetype: env inurl: com"
Tarasovych

1
Wyłączenie SELINUX działało dla mnie.
Prakash P

Odpowiedzi:


307

Nigdy nie ustawiaj katalogu na 777 . powinieneś zmienić prawo własności do katalogu. ustaw więc swojego obecnego użytkownika, z którym jesteś zalogowany jako właściciel, a użytkownika serwera WWW (dane www, apache, ...) jako grupę. Możesz spróbować tego:

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

następnie, aby ustawić uprawnienia do katalogu, spróbuj tego:

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

Aktualizacja:

Użytkownicy i grupy serwera WWW zależą od serwera WWW i systemu operacyjnego. Aby dowiedzieć się, kto jest użytkownikiem i grupą Twojego serwera WWW, użyj następujących poleceń. do użytku nginx:

ps aux|grep nginx|grep -v grep

do użytku apache:

ps aux | egrep '(apache|httpd)'


4
dzięki! W skrócie możesz też:sudo chown -R {your current user}:www-data storage bootstrap/cache
Ramesh Pareek

2
@RameshPareek Masz rację, ale po prostu chciałem być bardziej jasny;)
Hamid Parchami

1
To nie działa na mnie. Po prostu rozumiem chown: www-data: illegal group name. Ustawienie katalogu na 777 to jedyna rzecz, która działa
Matt D

3
@MattD Myślę, że grupa Apache na Macu to _wwwspróbuj tego sudo chgrp -R _www bootstrap/cache.
przydałby się

3
To powinna być wybrana odpowiedź, 100% zgadza się, że administratorzy systemów nie powinni tylko zezwalać na dostęp do wszystkiego, aby uniknąć rozwiązania prawdziwego problemu.
HyperionX

134

Nigdy nie używaj 777 dla katalogów na twoim serwerze live, ale na twoim własnym komputerze czasami musimy zrobić więcej niż 775, ponieważ

chmod -R 775 storage

Znaczy

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

Jeśli twój serwer WWW nie działa jako Vagrant, nie będzie mógł na nim pisać, więc masz 2 opcje:

chmod -R 777 storage

lub zmień grupę na użytkownika serwera WWW, zakładając, że jest to www-data:

chown -R vagrant:www-data storage

Nie potrzebowałem chmod w moim przypadku, ponieważ było już ustawione w porządku, jednak w Fedorze 20 potrzebowało:chown -R apache:apache laravelproject
misterjaytee

Wystąpił problem z montowaniem folderów przez sambę / vagrant - chown -R vagrant:www-data storageMiałem zrobiłem to dla mnie, dzięki.
Lewis

1
chmod -R 777 działał dla mnie. Próbowałem zmienić grupę, ale wciąż się dostawałemwww-data: illegal group name
Matt D

57

Aby rozwiązać ten problem, musisz zmienić własność katalogu na użytkownika uniksowego, z którego korzysta serwer WWW.

  1. Wyjdź z maszyny wirtualnej
  2. Korzystając z konsoli, przejdź do zsynchronizowanego folderu (włóczęga)
  3. sudo chown -R $ USER: przechowywanie danych www
  4. chmod -R 775 przechowywania

Mimo że utworzyłem projekt w maszynie wirtualnej przy użyciu użytkownika maszyny wirtualnej, folder należał do użytkownika na rzeczywistym komputerze; tak, kiedy próbujesz

Teraz to działa.

Dziękuję wszystkim, którzy pomogli mi to rozgryźć

EDYTOWAĆ:

Właściwie to nadal nie działało, nadal powodował problem z odmową pozwolenia.

Oto, co zrobiłem, zmodyfikowałem mój plik Vagrantfile w ten sposób:

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

Zrobiłem to ... i JESTEM DOBRANY! Nadal nie działa ... laravel 5 ... zmieniłem nazwę pliku dziennika, laravel utworzył nowy ... ten sam błąd
ied3vil

1
Nie mam config.vm.synced_folder, ponieważ używam homestead, jak mogę rozwiązać ten problem?
oleynikd

21
Nie powinieneś używać 777, kiedy chcesz.
IIllIIll

Nie widzę problemu z używaniem 777 w folderze. Wiem dokładnie, co jest w środku (fałszywy przykładowy projekt)
FRR

2
Absolutnie nie powinna to być akceptowana odpowiedź. To jest straszne. Nigdy nie ustawiaj 777. Zawsze.
CGriffin

39

Może to być również SELinux. (Centos, RedHat)

Określ status SElinux na terminalu:

$ sestatus

Jeśli status jest włączony, wpisz polecenie wyłączenia SElinux

$ setenforce Permissive

Lub możesz wykonać to polecenie

$ sudo setenforce 0


6
To jedyna rzecz, która zadziałała. Czy możesz wyjaśnić, co to robi?
hack4mer

2
@ hack4mer możesz przeczytać więcej informacji o seLinux. en.wikipedia.org/wiki/Security-Enhanced_Linux
Turan Zamanlı

dziwne rzeczy, które kiedykolwiek widziałem, dlaczego do cholery to działa po wyszukiwaniu przez ponad 6 godzin
Muhamad Yulianto

1
Jedyne rozwiązanie, które u mnie zadziałało… dziękuję. Ale problem powraca za każdym razem, gdy serwer uruchamia się ponownie, czy wiesz, jak go zastosować, nawet jeśli serwer jest restartowany?
Juan Angel

1
@JuanAngel musisz trwale wyłączyć usługę. otwórz w edytorze vim / etc / sysconfig / selinux, a następnie zmień dyrektywę SELinux = egzekwowanie na SELinux = wyłączone
Turan Zamanlı

32

Musisz dostosować uprawnienia storagei bootstrap/cache.

  • cd do swojego projektu Laravel.
  • sudo chmod -R 755 storage
  • sudo chmod -R 755 bootstrap/cache

Możesz spróbować 777, jeśli 755 nie działa. 777 nie jest jednak bezpieczne!

W zależności od tego, jak skonfigurowany jest serwer WWW, możesz być w stanie określić swoje uprawnienia bardziej szczegółowo i nadać je tylko użytkownikowi serwera WWW. Google, WEB SERVER NAME Laravel file permissionsaby uzyskać więcej informacji.

W chwili pisania tego tekstu dotyczy to Laravel 5.4


14

Dodać do composer.json

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

Po composer install


12

Uruchom następujące polecenia i możesz dodać sudona początku polecenia w zależności od systemu:

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

1
Nigdy nie używaj 777. Z uprawnieniami 777, dajesz każdemu z połączeniem pełny dostęp do plików lub katalogów z tymi uprawnieniami. Mogą je zmieniać w dowolny sposób, w tym złośliwie. Wiele incydentów włamań na konta wynika z 777 uprawnień.
Odyssee,

8

Dla wszystkich użytkowników Centos 7 w kontekście Laravel nie ma potrzeby wyłączania Selinux, wystarczy uruchomić następujące polecenia:

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

Na koniec upewnij się, że Twoje hosty, adresy IP i wirtualne hosty są poprawnie dostępne do zdalnego dostępu.

Selinux ma na celu ograniczenie dostępu nawet do użytkowników root, więc można uzyskać dostęp tylko do niezbędnych rzeczy, przynajmniej w ogólnym przeglądzie, to dodatkowe bezpieczeństwo, wyłączenie tego nie jest dobrą praktyką, istnieje wiele linków do nauki Selinux, ale do tego jeśli nie jest to nawet wymagane.


Chociaż ten link może odpowiedzieć na pytanie, lepiej jest zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie. - Z recenzji
Patrick Mevzek

Link jest bardzo wyraźny, nie ma potrzeby stosowania takiego mechanizmu, jest nawet sekcja specjalnie dla kontekstu Laravel SELinux. Myślę, że twoja opinia powinna być poparta nieco większą logiką niż zwykła praktyczna reguła. W międzyczasie odrzuciłeś odpowiedź, która najprawdopodobniej w 99% naprawi problemy bez stosowania się do złych praktyk, takich jak wyłączenie Selinux.
Daniel Santos

Nie ma problemu z wyrażeniem tego wprost lub nie. Ideą tej witryny jest to, że zawiera wszystkie istotne informacje, więc czytając odpowiedź, otrzymujemy wszystkie informacje. Linki zewnętrzne mogą gnić, a odpowiedź staje się bezwartościowa. Wyjaśniono to w centrum pomocy pod adresem stackoverflow.com/help/how-to-answer : „Zachęcamy do umieszczania linków do zewnętrznych zasobów, ale prosimy o dodanie kontekstu do łącza, aby inni użytkownicy mieli pojęcie, co to jest i dlaczego się tam znajduje . Zawsze cytuj najbardziej odpowiednią część ważnego linku, na wypadek gdyby strona docelowa była nieosiągalna lub została na stałe wyłączona.
Patrick Mevzek

Twoje pytanie zostało zgłoszone do sprawdzenia, to wszystko. I jest to sprzeczne z tym, co jest napisane w Centrum pomocy, które zacytowałem. Wszystkie odpowiedzi zawierające tylko link i bez opisu są odrzucane, a nawet usuwane. Zachęcamy do edycji swojej odpowiedzi, aby podać tutaj odpowiednią część wyjaśnienia. Możesz też odrzucić wszystkie odpowiedzi, które uważasz za złe. Z linku do recenzji widać, że nie byłem sam w zalecaniu zamknięcia Twojej odpowiedzi. Nie z powodów technicznych, tylko dlatego, że link nie wystarczy.
Patrick Mevzek,

Dziękuję za wyjaśnienie, nie wiedziałem, że takie wytyczne istnieją, a nawet jeśli podczas rejestracji otrzymasz wskazówkę dotyczącą przeczytania zasobów, nie pamiętam jej. To, co powiedziałeś, może być prawdą, link może gnić, ale odpowiedź można znaleźć bez wysiłku, niezależnie od tego, że ją zmodyfikuję.
Daniel Santos

6

Jeśli używasz cmd

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

Jeśli używasz GUI

Najpierw przejdź do projektu i kliknij prawym przyciskiem myszy magazyn, sprawdź właściwości i przejdź do zakładki Uprawnienia

wprowadź opis obrazu tutaj

Zmień uprawnienia za pomocą poniższego kodu

sudo chmod -R 777 storage

Wtedy właściwości pliku mogą być

wprowadź opis obrazu tutaj

Następnie sprawdź swoje ustawienia i wykonaj polecenie laravel to zadziała :)


Dziękuję yoouuuuuu
viniciussvl

5

W Laravel powinieneś ustawić ACL storagei cachekatalog tak, aby użytkownik serwera WWW mógł czytać / pisać w katalogu. Otwórz nowy terminal i uruchom:

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/

Bibliografia:

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

Może być późno, ale może komuś pomóc, zmiana uprawnień do katalogu zadziałała.

Zakładając, że Twój projekt Laravel znajduje się w /var/www/html/katalogu.

cd /var/www/html/

Następnie zmień uprawnienia katalogów storage/i 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

To rozwiązanie jest specyficzne dla Laravel 5.5

Musisz zmienić uprawnienia do kilku folderów: chmod -R -777 przechowywanie / logi chmod -R -777 przechowywanie / framework dla powyższych folderów 775 lub 765 nie działa dla mojego projektu

chmod -R 775 bootstrap/cache 

Również własność folderu projektu powinna wyglądać następująco (bieżący użytkownik): (użytkownik serwera WWW)



1

Nie chciałem zmieniać uprawnień do folderów na 777. Oto jak rozwiązałem ten problem.

Najpierw zmieniłem użytkownika, który uruchamia serwer WWW na moim komputerze lokalnym (uruchamiam nginx, ale zasady obowiązują wszędzie):

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

Następnie utworzyłem kolejny index.phpplik w public/folderze, aby dowiedzieć się, kto używa mojej wersji php-fpm i gdzie powinienem to zmienić:

<?php
phpinfo();
?>

Przeładowując stronę, dowiedziałem się, że www-databył to użytkownik (w sekcji środowisko). Dowiedziałem się również, że korzystam z php 7.1. Przystąpiłem do zmiany użytkownika:

$> 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.

Na koniec nadałem folderom następujące uprawnienia:

sudo chmod -R 775 ./storage/

Teraz upewniłem się, że jestem właścicielem folderów, używając prostego:

ls -al

Jeśli ustawisz serwer i użytkowników php-fpm na siebie, a foldery są własnością roota, na przykład, będziesz napotykać ten problem. Może się to zdarzyć, jeśli masz uprawnienia sudo laravel new <project>roota. W takim przypadku upewnij się, że używasz w chownprojekcie polecenia rekurencyjnego, aby zmienić user:groupustawienia. W większości domyślnych przypadków www-datajest głównym ustawieniem serwera i php, w tym przypadku należy upewnić się, że folder nie jest pozawww-data zasięgiem.

Mój projekt jest ustawiony w moim katalogu domowym. W Ubuntu 16.04 i Laravel 5.5.


1

Spróbuj tego

  1. cd / var / www / html
  2. setenforce 0
  3. usługa httpd restart

Czy mógłbyś wyjaśnić, co to robi?
Coraz bardziej idiotyczny

1
Nie ma potrzeby zmieniania katalogów, które mają być używane, setenforceale w każdym przypadku całkowite wyłączenie SELinuxa tylko po to, aby naprawić jeden problem z uprawnieniami.
Patrick Mevzek,

0

W moim konkretnym przypadku miałem wygenerowany plik konfiguracyjny i buforowany w bootstrap/cache/katalogu, więc moje kroki, w których:

  1. Usuń wszystkie wygenerowane pliki z pamięci podręcznej: rm bootstrap/cache/*.php
  2. Utwórz nowy laravel.logplik i zastosuj aktualizację uprawnień do pliku za pomocą:

    • chmod -R 775 storage

0

(na Ubuntu ): Można to rozwiązać w 2 prostych krokach:

$ sudo chmod -R 777 storage 

I

$ sudo service apache2 restart

Krok 3: zhakuj swój serwer i / lub swoich użytkowników, ponieważ otworzyłeś swoje pliki dla świata.
miken32

0

Usuń "/var/www/laravel/app/storage/logs/laravel.log"i spróbuj ponownie:

rm storage/logs/laravel.log



-1

Ten błąd można naprawić, wyłączając system Linux.

Sprawdź, czy została włączona

sestatus

Próbujesz..

setenforce 0


5
„wyłączając Linuksa ”? To poważnie posuwa się za daleko :-)!
Patrick Mevzek

-1

W przypadku tego błędu:

Błąd w module obsługi wyjątków: nie można otworzyć strumienia lub pliku „/var/www/laravel/app/storage/logs/laravel.log”: nie można otworzyć strumienia: odmowa uprawnień w / var / www / laravel / bootstrap / compiled .php: 8423

użyj tego polecenia w terminalu:

sudo chmod -R 777 storage

2
szkoda dla środowiska produkcyjnego
Ariful Haque

-1

Naprawiono mój problem z tym poleceniem w Centos 7.6 Server

chcon -R -t httpd_sys_content_t $SITE_PATH

chcon -R -t httpd_sys_rw_content_t $SITE_PATH
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.