So beheben Sie den Fehler: laravel.log konnte nicht geöffnet werden?

182

Tatsächlich bin ich ziemlich neu bei Laravel und versuche mein erstes Projekt zu erstellen. Aus irgendeinem Grund wird dieser Fehler immer wieder angezeigt (ich habe noch nicht einmal mit dem Codieren begonnen).

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

Ich habe gelesen, dass dies etwas mit Berechtigungen zu tun hat, aber chmod -R 775 storageüberhaupt nicht geholfen hat.

Berechtigungen

FRR
quelle
Sind Sie sicher, dass Sie sich im richtigen Verzeichnis befinden, wenn Sie diesen Befehl chmod ausführen? Versuchen Sie es mit chmod -R 755 / var / www / laravel / app / storage. Auf was sind Benutzer und Gruppe eingestellt? Versuchen Sie ls -al / var / www / laravel / app / storage
Ryan LaBarre
Gleiche Ergebnisse (Ich habe meinen ursprünglichen Beitrag aktualisiert, um die Berechtigungen des Ordners
anzuzeigen
: / aus irgendeinem Grund funktioniert es immer noch nicht. Ich habe es vorher nicht erwähnt, aber ich benutze Vagabund. Mein www-Ordner befindet sich also auf einer VM (Apache, PHP und alles andere läuft darauf). Ich bin mir nicht sicher, ob das etwas mit irgendetwas zu tun hat, aber ich dachte, ich würde es nur für den Fall erwähnen. (Ich erstelle mein Projekt mit dem VM mit Composer)
FRR
12
Diejenigen, die 777 vorschlagen, versuchen, diesen Satz zu googeln: "Produktion db_password Dateityp: env inurl: com"
Tarasovych
1
Das Deaktivieren von SELINUX hat bei mir funktioniert.
Prakash P

Antworten:

299

Stellen Sie niemals ein Verzeichnis auf 777 ein . Sie sollten den Verzeichnisbesitz ändern. Stellen Sie also Ihren aktuellen Benutzer so ein, dass Sie als Eigentümer und den Webserver-Benutzer (www-data, apache, ...) als Gruppe angemeldet sind. Sie können dies versuchen:

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

Versuchen Sie dann Folgendes, um die Verzeichnisberechtigung festzulegen:

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

Aktualisieren:

Der Benutzer und die Gruppe des Webservers hängen von Ihrem Webserver und Ihrem Betriebssystem ab. Verwenden Sie die folgenden Befehle, um herauszufinden, was Ihr Webserverbenutzer und Ihre Gruppe sind. für Nginx verwenden:

ps aux|grep nginx|grep -v grep

für Apache verwenden:

ps aux | egrep '(apache|httpd)'

Hamid Parchami
quelle
4
Vielen Dank! Kurz gesagt, Sie können auch tun:sudo chown -R {your current user}:www-data storage bootstrap/cache
Ramesh Pareek
2
@RameshPareek Du hast recht, aber ich wollte nur klarer sein;)
Hamid Parchami
1
Das funktioniert bei mir nicht. Ich verstehe nur chown: www-data: illegal group name. Das Einstellen des Verzeichnisses auf 777 ist das einzige, was funktioniert
Matt D
3
@MattD Ich denke, die Apache-Gruppe auf dem Mac _wwwversucht dies sudo chgrp -R _www bootstrap/cache. Es wäre hilfreich, einen Blick auf diesen Beitrag zu werfen
Hamid Parchami
3
Dies sollte die gewählte Antwort sein. 100% stimmen zu, dass Systemadministratoren nicht nur den Zugriff auf alles ermöglichen sollten, um zu vermeiden, dass das eigentliche Problem gelöst wird.
HyperionX
134

Verwenden Sie 777 niemals für Verzeichnisse auf Ihrem Live-Server, aber auf Ihrem eigenen Computer müssen wir manchmal mehr als 775 ausführen, weil

chmod -R 775 storage

Meint

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

Wenn Ihr Webserver nicht als Vagrant ausgeführt wird, kann er nicht darauf schreiben. Sie haben also zwei Möglichkeiten:

chmod -R 777 storage

oder ändern Sie die Gruppe in Ihren Webserver-Benutzer, vorausgesetzt, es ist www-data:

chown -R vagrant:www-data storage
Antonio Carlos Ribeiro
quelle
Ich brauchte das chmod in meinem Fall nicht, da es bereits in Ordnung war. Auf Fedora 20 brauchte es jedoch:chown -R apache:apache laravelproject
misterjaytee
Hatte Probleme beim Mounten von Ordnern über Samba / Vagrant - chown -R vagrant:www-data storagehabe es für mich getan, danke.
Lewis
1
chmod -R 777 Speicher hat bei mir funktioniert. Ich habe versucht, die Gruppe zu wechseln, aber ich bekam immerwww-data: illegal group name
Matt D
57

Um dieses Problem zu beheben, müssen Sie den Besitz des Verzeichnisses auf den vom Webserver verwendeten Unix-Benutzer ändern.

  1. Raus aus der VM
  2. Wechseln Sie über die Konsole zu Ihrem synchronisierten Ordner (Vagrant).
  3. sudo chown -R $ USER: www-Datenspeicherung
  4. chmod -R 775 Speicher

Obwohl ich das Projekt innerhalb der VM mit dem VM-Benutzer erstellt habe, gehörte der Ordner dem Benutzer auf dem realen Computer. Also, wenn ich es versuche

Jetzt geht es.

Vielen Dank an alle, die mir geholfen haben, diese Sache herauszufinden

BEARBEITEN:

Eigentlich funktionierte es immer noch nicht, es gab mir immer noch ein Problem "Erlaubnis verweigert".

Folgendes habe ich getan: Ich habe mein Vagrantfile folgendermaßen geändert:

config.vm.synced_folder "./app","/var/www/", create:true,
:owner => "vagrant",
:group => "www-data",
:mount_options => ["dmode=775","fmode=664"]
FRR
quelle
Ich habe das getan ... und ich bin verrückt! Funktioniert immer noch nicht ... Laravel 5 ... hat die Protokolldatei umbenannt, Laravel hat eine neue erstellt ... der gleiche Fehler
ied3vil
1
Ich habe keinen config.vm.synced_folder, da ich homestead verwende. Wie kann ich dieses Problem beheben?
Oleynikd
21
Sie sollten 777 nicht wohl oder übel verwenden.
IIllIIll
Ich sehe kein Problem bei der Verwendung von 777 in einem Ordner, von dem ich genau weiß, was sich darin befindet (ein Dummy-Beispielprojekt)
FRR
2
Dies sollte absolut nicht die akzeptierte Antwort sein. Es ist schrecklich. Niemals 777 einstellen.
CGriffin
37

Es kann auch SELinux sein. (Centos, RedHat)

Bestimmen Sie den Status von SElinux am Terminal:

$ sestatus

Wenn der Status aktiviert ist, schreiben Sie einen Befehl, um SElinux zu deaktivieren

$ setenforce Permissive

Oder Sie können diesen Befehl ausführen

$ sudo setenforce 0

Turan Zamanlı
quelle
6
Dies ist das einzige, was funktioniert hat. Können Sie bitte erklären, was es tut?
Hack4mer
2
@ hack4mer können Sie weitere Informationen über seLinux lesen. en.wikipedia.org/wiki/Security-Enhanced_Linux
Turan Zamanlı
die seltsamen Dinge, die ich je gesehen habe, warum zum Teufel es funktioniert, nachdem ich mehr als 6 Stunden gesucht habe
Muhamad Yulianto
1
Die einzige Lösung, die für mich funktioniert hat .. danke. Aber das Problem tritt jedes Mal wieder auf, wenn der Server neu gestartet wird. Wissen Sie, wie Sie es anwenden können, selbst wenn der Server neu gestartet wird?
Juan Angel
1
@JuanAngel Sie müssen den Dienst dauerhaft deaktivieren. Öffnen Sie mit dem Editor vim / etc / sysconfig / selinux und ändern Sie dann die Direktive SELinux = erzwingen in SELinux = deaktiviert
Turan Zamanlı
31

Sie müssen die Berechtigungen von storageund anpassen bootstrap/cache.

  • cd in Ihr Laravel-Projekt.
  • sudo chmod -R 755 storage
  • sudo chmod -R 755 bootstrap/cache

Sie können 777 ausprobieren, wenn 755 nicht funktioniert. 777 ist allerdings nicht sicher!

Abhängig davon, wie Ihr Webserver eingerichtet ist, können Sie Ihre Berechtigungen möglicherweise genauer festlegen und sie nur Ihrem Webserverbenutzer gewähren. Google WEB SERVER NAME Laravel file permissionsfür weitere Informationen.

Zum Zeitpunkt des Schreibens ist dies für Laravel 5.4

Daniel Dewhurst
quelle
14

Hinzufügen composer.json

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

Nach dem composer install

Davron Achilov
quelle
12

Führen Sie die folgenden Befehle aus, die Sie sudozu Beginn des Befehls hinzufügen können. Dies hängt von Ihrem System ab:

chmod -R 775 storage/framework
chmod -R 775 storage/logs
chmod -R 775 bootstrap/cache 
gauravbhai daxini
quelle
1
Verwenden Sie niemals 777. Mit 777-Berechtigungen gewähren Sie jedem mit einer Verbindung vollen Zugriff auf die Dateien oder Verzeichnisse mit diesen Berechtigungen. Sie können sie auf jede von ihnen gewählte Weise ändern, auch in böswilliger Absicht. Viele Vorfälle mit Account-Hacking sind auf 777 Berechtigungen zurückzuführen.
Odyssee
8

Für alle Centos 7-Benutzer in einem Laravel-Kontext muss Selinux nicht deaktiviert werden. Führen Sie einfach die folgenden Befehle aus:

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

Stellen Sie schließlich sicher, dass Ihre Hosts, IPs und virtuellen Hosts für den Remotezugriff korrekt sind.

Selinux soll den Zugriff auch auf Root-Benutzer beschränken, so dass möglicherweise nur auf das erforderliche Material zugegriffen werden kann, zumindest in einer allgemeinen Übersicht, es ist zusätzliche Sicherheit, das Deaktivieren ist keine gute Praxis, es gibt viele Links, um Selinux zu lernen, aber dafür Fall ist es nicht einmal erforderlich.

Daniel Santos
quelle
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - Aus dem Rückblick
Patrick Mevzek
Der Link ist sehr explizit, es besteht keine Notwendigkeit für einen solchen Mechanismus, es gibt sogar einen Abschnitt speziell für einen Laravel SELinux-Kontext. Ich denke, dass Ihre Meinung durch ein bisschen mehr Logik als nur eine einfache Faustregel gestützt werden sollte. In der Zwischenzeit haben Sie eine Antwort abgelehnt, mit der die Probleme höchstwahrscheinlich zu 99% behoben werden können, ohne sich an schlechte Praktiken wie das Deaktivieren von Selinux zu halten.
Daniel Santos
Es ist kein Problem, explizit zu sein oder nicht. Die Idee dieser Site ist, dass sie alle relevanten Informationen enthält. Wenn wir also eine Antwort lesen, erhalten wir alle. Externe Links können verrotten und die Antwort wird wertlos. Dies wird in der Hilfe unter stackoverflow.com/help/how-to-answer erläutert : "Links zu externen Ressourcen werden empfohlen. Fügen Sie jedoch einen Kontext um den Link hinzu, damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es dort ist . permanent offline die Zielstelle nicht erreichbar ist oder geht immer den relevanten Teil einer wichtigen Verbindung zitieren, für den Fall. "
Patrick Mevzek
Ihre Frage wurde zur Überprüfung markiert, das ist alles. Und es widerspricht dem, was in der von mir zitierten Hilfe geschrieben steht. Alle Antworten mit nur Link und ohne Beschreibung werden herabgestuft und sogar entfernt. Sie können Ihre Antwort jederzeit bearbeiten, um den relevanten Teil der Erklärung hier bereitzustellen. Und Sie können selbst alle Antworten ablehnen, die Sie für schlecht halten. Sie können dem Bewertungslink entnehmen, dass ich nicht allein empfohlen habe, Ihre Antwort zu schließen. Nicht aus technischen Gründen, nur weil ein Link nicht ausreicht.
Patrick Mevzek
Vielen Dank für die Klarstellung, ich wusste nicht, dass es solche Richtlinien gibt, oder wenn Sie bei der Registrierung einen Tipp zum Lesen von Ressourcen erhalten, kann ich mich nicht daran erinnern. Was Sie gesagt haben, mag wahr sein, der Link mag verrotten, aber eine Antwort kann ohne Aufwand erreicht werden, unabhängig davon, ich werde sie bearbeiten.
Daniel Santos
6

Wenn Sie cmd verwenden

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

Wenn Sie GUI verwenden

Gehen Sie zuerst zum Projekt und klicken Sie mit der rechten Maustaste auf den Speicher, überprüfen Sie die Eigenschaften und wechseln Sie zur Registerkarte Berechtigungen

Geben Sie hier die Bildbeschreibung ein

Ändern Sie die Berechtigungen mit dem folgenden Code

sudo chmod -R 777 storage

Dann können Ihre Dateieigenschaften sein

Geben Sie hier die Bildbeschreibung ein

Dann überprüfe deine Einstellungen und führe den Laravel-Befehl aus, es wird funktionieren :)

Thilina Dharmasena
quelle
Vielen Dank yoouuuuuu
viniciussvl
5

In Laravel sollten Sie ACL storageund cacheVerzeichnis festlegen, damit der Webserverbenutzer das Verzeichnis lesen / schreiben kann. Öffnen Sie ein neues Terminal und führen Sie Folgendes aus:

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/

Verweise:

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

Pratik
quelle
3

Es könnte spät sein, aber jemandem helfen, das Ändern der Verzeichnisberechtigungen hat bei mir funktioniert.

Angenommen, Ihr Laravel-Projekt befindet sich im /var/www/html/Verzeichnis.

cd /var/www/html/

Ändern Sie dann die Berechtigungen storage/und bootstrap/cache/Verzeichnisse.

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/
Hamza Rashid
quelle
2

Diese Lösung ist spezifisch für Laravel 5.5

Sie müssen die Berechtigungen für einige Ordner ändern: chmod -R -777 Speicher / Protokolle chmod -R -777 Speicher / Framework für die oben genannten Ordner 775 oder 765 funktionierten für mein Projekt nicht

chmod -R 775 bootstrap/cache 

Außerdem sollte der Eigentümer des Projektordners wie folgt sein (aktueller Benutzer) :( Webserver-Benutzer)

s_user
quelle
2

Du könntest es tun:

chcon -R -t httpd_sys_rw_content_t storage
Leandro Gorriz
quelle
1

Ich war nicht besonders daran interessiert, meine Ordnerberechtigungen auf 777 zu ändern. So habe ich dieses Problem behoben.

Zuerst habe ich den Benutzer geändert, der den Webserver auf meinem lokalen Computer ausführt (ich führe nginx aus, aber die Prinzipien gelten überall):

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

Danach habe ich eine weitere index.phpDatei unter dem public/Ordner erstellt, um herauszufinden, wer meine PHP-Fpm-Version ausführt und wo ich das ändern würde:

<?php
phpinfo();
?>

Beim erneuten Laden der Seite stellte ich fest, dass www-dataes sich um den Benutzer handelte (im Abschnitt "Umgebung"). Ich fand auch heraus, dass ich PHP 7.1 laufen ließ. Ich habe den Benutzer geändert:

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

Schließlich habe ich Ordnern die folgenden Berechtigungen erteilt:

sudo chmod -R 775 ./storage/

Jetzt stellte ich sicher, dass ich der Eigentümer der Ordner war, indem ich Folgendes verwendete:

ls -al

Wenn Sie die Server- und PHP-Fpm-Benutzer auf sich selbst einstellen und die Ordner beispielsweise Root gehören, tritt dieses Problem weiterhin auf. Dies kann passieren, wenn Sie eine sudo laravel new <project>als root ausgeführt haben. Stellen Sie in diesem Fall sicher, dass Sie einen rekursiven chownBefehl für Ihr Projekt verwenden, um die user:groupEinstellungen zu ändern . In den meisten Standardfällen www-dataist dies die Haupteinstellung für den Server und PHP. In diesem Fall muss sichergestellt werden, dass der Ordner nicht leer istwww-data Reichweite liegt.

Mein Projekt wird in meinem Home-Verzeichnis eingerichtet. Unter Ubuntu 16.04 und Laravel 5.5.

Patrick.SE
quelle
1

Versuche dies

  1. cd / var / www / html
  2. setenforce 0
  3. Service httpd Neustart
Dan Christian Febra
quelle
Können Sie erklären, was dies bewirkt?
Zunehmend idiotisch
1
Es ist nicht erforderlich, die zu verwendenden Verzeichnisse zu ändern, setenforceaber es ist auf jeden Fall falsch, SELinux vollständig zu deaktivieren, um nur ein Berechtigungsproblem zu beheben.
Patrick Mevzek
0

In meinem speziellen Fall wurde eine Konfigurationsdatei generiert und im bootstrap/cache/Verzeichnis zwischengespeichert, sodass meine Schritte wie folgt waren:

  1. Entfernen Sie alle generierten zwischengespeicherten Dateien: rm bootstrap/cache/*.php
  2. Erstellen Sie eine neue laravel.logDatei und wenden Sie die Aktualisierung der Berechtigungen auf die Datei an, indem Sie:

    • chmod -R 775 storage
Crisoforo Gaspar
quelle
0

(unter Ubuntu ): Kann in 2 einfachen Schritten gelöst werden:

$ sudo chmod -R 777 storage 

Und

$ sudo service apache2 restart
Rost
quelle
Schritt 3: Lassen Sie Ihren Server und / oder Ihre Benutzer hacken, weil Sie Ihre Dateien für die Welt geöffnet haben.
miken32
0

Löschen "/var/www/laravel/app/storage/logs/laravel.log"und erneut versuchen:

rm storage/logs/laravel.log

Gjaa
quelle
-1

Hatte dieses Problem und fand dies und es löste das Problem.

Geben Sie hier die Bildbeschreibung ein

user2848911
quelle
-1

Dieser Fehler kann durch Deaktivieren von Linux behoben werden.

Überprüfen Sie, ob es aktiviert wurde

sestatus

Sie versuchen..

setenforce 0

Orxanzadeh
quelle
5
"durch Deaktivieren von Linux "? Das geht ernsthaft zu weit :-)!
Patrick Mevzek
-1

Für diesen Fehler:

Fehler im Ausnahmebehandler: Der Stream oder die Datei "/var/www/laravel/app/storage/logs/laravel.log" konnte nicht geöffnet werden: Stream konnte nicht geöffnet werden: Berechtigung in / var / www / laravel / bootstrap / compiled verweigert .php: 8423

Verwenden Sie diesen Befehl im Terminal:

sudo chmod -R 777 storage
khushbu vaishnav
quelle
2
Schade
-1

Mein Problem mit diesem Befehl in Centos 7.6 Server wurde behoben

chcon -R -t httpd_sys_content_t $SITE_PATH

chcon -R -t httpd_sys_rw_content_t $SITE_PATH
HamidNE
quelle