Wie richte ich Dateiberechtigungen für Laravel ein?


231

Ich verwende Apache Web Server, für den der Eigentümer festgelegt ist _www:_www. Ich weiß nie, was die beste Vorgehensweise bei Dateiberechtigungen ist, beispielsweise wenn ich ein neues Laravel 5-Projekt erstelle.

Für Laravel 5 muss der /storageOrdner beschreibbar sein. Ich habe viele verschiedene Ansätze gefunden, damit es funktioniert, und ich 777beende es normalerweise damit, es rekursiv chmod zu machen. Ich weiß, dass es nicht die beste Idee ist.

Der offizielle Arzt sagt:

Für Laravel müssen möglicherweise einige Berechtigungen konfiguriert werden: Ordner innerhalb storageund vendorerfordern Schreibzugriff durch den Webserver.

Bedeutet dies, dass der Webserver auch Zugriff auf die Ordner storageund vendoroder nur auf deren aktuellen Inhalt benötigt?

Ich gehe davon aus, dass es viel besser ist, den Besitzer anstelle von Berechtigungen zu wechseln . Ich habe alle Dateiberechtigungen von Laravel rekursiv in geändert, _www:_wwwund dadurch funktionierte die Site ordnungsgemäß, als hätte ich chmod in geändert 777. Das Problem ist, dass mein Texteditor mich jetzt jedes Mal nach einem Passwort fragt, wenn ich eine Datei speichern möchte, und dasselbe passiert, wenn ich versuche, etwas im Finder zu ändern, wie zum Beispiel eine Datei zu kopieren.

Was ist der richtige Ansatz, um diese Probleme zu lösen?

  1. Veränderung chmod
  2. Ändern Sie den Eigentümer der Dateien so, dass er mit dem des Webservers übereinstimmt, und stellen Sie möglicherweise den Texteditor (und den Finder?) So ein, dass die Frage nach dem Kennwort übersprungen oder verwendet wird sudo
  3. Ändern Sie den Besitzer des Webservers so, dass er dem Betriebssystembenutzer entspricht (ich kenne die Konsequenzen nicht).
  4. Etwas anderes

4
Ich denke, es 777ist zu viel Freiheit, weil es alle Berechtigungen für alle beinhaltet.
Robo Robok

Aus den Laravel-Dokumenten: Verzeichnisse innerhalb der storageund die bootstrap/cacheVerzeichnisse sollten von Ihrem Webserver beschreibbar sein
Joshuamabina

1
Verwenden Sie fcgi und Sie können 755/644 für alle (inkl. öffentlich / Speicher)
Jeffz

@jww stimmt zu, könnten wir die Frage auf Serverfehler verschieben, anstatt sie zurückzustellen?
wp78de

Antworten:


584

Nur um das Offensichtliche für jeden zu sagen, der diese Diskussion sieht ... Wenn Sie einem Ihrer Ordner 777 Berechtigungen erteilen, erlauben Sie JEDEM, eine Datei in diesem Verzeichnis zu lesen, zu schreiben und auszuführen ... was dies bedeutet, haben Sie angegeben JEDER (jeder Hacker oder jede böswillige Person auf der ganzen Welt) hat die Erlaubnis, JEDE Datei, jeden Virus oder jede andere Datei hochzuladen und diese Datei dann auszuführen ...

WENN SIE IHRE ORDNERERLAUBNISSE AUF 777 EINSTELLEN, HABEN SIE IHREN SERVER FÜR JEDEN GEÖFFNET, DER DIESES VERZEICHNIS FINDEN KANN. Klar genug??? :) :)

Grundsätzlich gibt es zwei Möglichkeiten, um Ihren Besitz und Ihre Berechtigungen einzurichten. Entweder geben Sie sich selbst das Eigentum oder Sie machen den Webserver zum Eigentümer aller Dateien.

Webserver als Eigentümer (wie es die meisten Leute tun und wie es das Laravel-Dokument tut):

Angenommen, www-data (es könnte etwas anderes sein) ist Ihr Webserver-Benutzer.

sudo chown -R www-data: www-data / path / to / your / laravel / root / directory

Wenn Sie dies tun, besitzt der Webserver alle Dateien und ist auch die Gruppe. Sie haben einige Probleme beim Hochladen von Dateien oder beim Arbeiten mit Dateien über FTP, da Ihr FTP-Client als Sie angemeldet ist und nicht als Ihr Webserver Ihr Benutzer zur Webserver-Benutzergruppe:

sudo usermod -a -G www-data ubuntu

Dies setzt natürlich voraus, dass Ihr Webserver als WWW-Daten ausgeführt wird (die Standardeinstellung für Homestead) und Ihr Benutzer Ubuntu ist (es ist vagabundierend, wenn Sie Homestead verwenden).

Dann setzen Sie alle Ihre Verzeichnisse auf 755 und Ihre Dateien auf 644 ... SET-Dateiberechtigungen

sudo find / path / to / your / laravel / root / Verzeichnis-Typ f -exec chmod 644 {} \;    

SET-Verzeichnisberechtigungen

sudo find / path / to / your / laravel / root / Verzeichnis-Typ d -exec chmod 755 {} \;

Ihr Benutzer als Eigentümer

Ich bevorzuge es, alle Verzeichnisse und Dateien zu besitzen (es erleichtert die Arbeit mit allem viel), also mache ich:

sudo chown -R mein-Benutzer: www-data / path / to / your / laravel / root / directory

Dann gebe ich mir und dem Webserver die Berechtigung:

sudo find / path / to / your / laravel / root / Verzeichnis-Typ f -exec chmod 664 {} \;    
sudo find / path / to / your / laravel / root / Verzeichnis-Typ d -exec chmod 775 {} \;

Geben Sie dem Webserver dann die Rechte zum Lesen und Schreiben in Speicher und Cache

Unabhängig davon, wie Sie es einrichten, müssen Sie dem Webserver Lese- und Schreibberechtigungen für Speicher, Cache und andere Verzeichnisse erteilen, die der Webserver hochladen oder auch schreiben muss (abhängig von Ihrer Situation). Führen Sie daher die folgenden Befehle aus bashy aus:

sudo chgrp -R www-Datenspeicher Bootstrap / Cache
sudo chmod -R ug + rwx Speicher Bootstrap / Cache

Jetzt sind Sie sicher und Ihre Website funktioniert UND Sie können ziemlich einfach mit den Dateien arbeiten


4
Tolles Beispiel, wenn es keinen WWW-
Datenbenutzer

52
Ich denke, die Leute verstehen das anyoneKonzept zu sehr falsch . Das Linux- anyoneFlag bedeutet jeden Benutzer , keine Person. Sie benötigen noch Serverzugriff.
Marco Aurélio Deleu

3
@ andreshg112 Die ersten WWW-Daten sind der Name des Benutzers und die zweiten WWW-Daten sind der Name der Gruppe. Es bedeutet also, dass der Besitzer Apache und (diese Gruppe) Apache ist. Verwenden Sie www-data: www-data oder fügen Sie Ihren Benutzer dieser Gruppe hinzu. (CLI: useradd -G {Gruppenname} Benutzername), und dann können Sie zu Benutzername chown: www-Gruppe
Denis Solakovic

2
@fs_tigre Ich glaube, es gibt überhaupt keinen großen Unterschied in Bezug auf die Sicherheit ... außer ich denke, dass es zwei Benutzer gibt, für die Kennwörter anstelle von einem erraten werden müssen, und natürlich melde ich mich die ganze Zeit mit meinem Benutzerkonto an, also wenn Ich habe es auf unsichere Weise gemacht (normales FTP und zum Beispiel mit einem Passwort), es könnte die Site gefährden, aber ich melde mich nur mit Putty und SSH an, und wenn ich FTP benutze, ist es SFTP, also überhaupt keine Probleme. Die Befehle von bashy vorgeschlagen werden empfohlen , weil sie die Sticky - Bit gesetzt, so dass , wenn die Webserver Verzeichnisse erstellt werden sie den gleichen Besitzer / Berechtigungen als Mutter haben
bgies

2
Wäre der Benutzer bei der ersten Methode nicht immer noch nicht in der Lage, Dateien hochzuladen, da Sie writeder Gruppe keine Berechtigung erteilt haben?
Fahmi

44

Die Berechtigungen für die Ordner storageund vendorsollten 775aus offensichtlichen Sicherheitsgründen beibehalten werden.

Sowohl Ihr Computer als auch Ihr Server Apache müssen jedoch in der Lage sein, in diese Ordner zu schreiben. Beispiel: Wenn Sie Befehle wie ausführen php artisan, muss Ihr Computer in die Protokolldatei schreiben storage.

Alles, was Sie tun müssen, ist, Apache das Eigentum an den Ordnern zu übertragen:

sudo chown -R www-data:www-data /path/to/your/project/vendor
sudo chown -R www-data:www-data /path/to/your/project/storage

Dann müssen Sie Ihren Computer (auf den er verweist username) zu der Gruppe hinzufügen, zu der der Server Apache gehört. Wie so:

sudo usermod -a -G www-data userName

HINWEIS: Am häufigsten wird groupNamees www-datajedoch in Ihrem Fall durch ersetzt_www


10
+1 Ich mag diesen Ansatz. Aber ich glaube, die chownBefehle sollten das -R-Flag enthalten. Außerdem sollten Sie in Laravel 5.1 und 5.2 anstelle des Herstellerverzeichnisses Zugriff auf das Bootstrap / Cache-Verzeichnis gewähren.
Jason Wheeler

Gibt es eine Möglichkeit zu testen, ob dies gut funktioniert? Ich meine, wenn die neue Protokolldatei im Verzeichnis storage / logs erstellt wird, die über die richtigen Berechtigungen verfügt, wie kann ich das überprüfen?
Chaudhry Waqas

20

Beim Einrichten von Berechtigungen für Laravel-Anwendungen sind viele Randfälle aufgetreten. Wir erstellen ein separates Benutzerkonto ( deploy) für den Besitz des Laravel-Anwendungsordners und die Ausführung von Laravel-Befehlen über die CLI und führen den Webserver unter aus www-data. Ein Problem, das dies verursacht, besteht darin, dass die Protokolldatei (en) möglicherweise Eigentum der Protokolldatei sind www-dataoder deploy, je nachdem, wer zuerst in die Protokolldatei geschrieben hat, den anderen Benutzer in Zukunft offensichtlich daran hindern, darauf zu schreiben.

Ich habe festgestellt, dass die einzig vernünftige und sichere Lösung die Verwendung von Linux-ACLs ist. Das Ziel dieser Lösung ist:

  1. Damit der Benutzer, der die Anwendung besitzt / bereitstellt, Lese- und Schreibzugriff auf den Laravel-Anwendungscode erhält (wir verwenden einen Benutzer mit dem Namen deploy).
  2. Damit kann der www-dataBenutzer Lesezugriff auf Laravel-Anwendungscode, jedoch keinen Schreibzugriff erhalten.
  3. Um zu verhindern, dass andere Benutzer überhaupt auf den Laravel-Anwendungscode / die Laravel-Anwendungsdaten zugreifen.
  4. Damit sowohl der www-dataBenutzer als auch die Anwendung user ( deploy) Schreibzugriff auf den Speicherordner erhalten, unabhängig davon, welchem ​​Benutzer die Datei gehört (also beide deployund www-datakönnen beispielsweise in dieselbe Protokolldatei schreiben).

Dies erreichen wir wie folgt:

  1. Alle Dateien innerhalb des application/Ordners werden mit der Standard-Umask von erstellt 0022, was dazu führt, dass Ordner drwxr-xr-xBerechtigungen und Dateien haben -rw-r--r--.
  2. sudo chown -R deploy:deploy application/(oder stellen Sie einfach Ihre Anwendung als deployBenutzer bereit, was wir auch tun).
  3. chgrp www-data application/um der www-dataGruppe Zugriff auf die Anwendung zu gewähren .
  4. chmod 750 application/um dem deployBenutzer das Lesen / Schreiben zu ermöglichen, den www-dataBenutzer schreibgeschützt zu machen und alle Berechtigungen für andere Benutzer zu entfernen.
  5. setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/um die Standardberechtigungen für den storage/Ordner und alle Unterordner festzulegen. Alle neuen Ordner / Dateien, die im Speicherordner erstellt wurden, erben diese Berechtigungen ( rwxfür beide www-dataund deploy).
  6. setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/ um die oben genannten Berechtigungen für vorhandene Dateien / Ordner festzulegen.

15

Ändern Sie die Berechtigungen für Ihren Projektordner, um Lesen / Schreiben / Ausführen für jeden Benutzer in der Gruppe zu aktivieren, der das Verzeichnis besitzt (in Ihrem Fall _www):

chmod -R 775 /path/to/your/project

Fügen Sie dann Ihren OS X-Benutzernamen zur _wwwGruppe hinzu, um den Zugriff auf das Verzeichnis zu ermöglichen:

sudo dseditgroup -o edit -a yourusername -t user _www

Wenn ich dseditgroupvon Ihnen zur Verfügung gestellt werde, erhalte ich eine Fehlermeldung : Username and password must be provided..
Robo Robok

Mein Fehler, Sie müssen diesen Befehl mit einem Benutzer ausführen, der über die entsprechenden Berechtigungen verfügt. Fügen Sie ihn also einfach sudoam Anfang hinzu.
Bogdan

Muss ich also den Besitzer dieser Dateien ändern _www:_wwwoder myuser:_wwwauch?
Robo Robok

Sie können es verlassen _www:_www, da 775 bedeutet, dass jeder Benutzer in der Gruppe _wwwüber die vollständigen Berechtigungen zum Lesen / Schreiben / Ausführen in diesem Ordner verfügt und Sie gerade Ihren Benutzernamen zu dieser Gruppe hinzugefügt haben.
Bogdan

Könntest du mir eins sagen? Was bedeutet es chown myuser:_www? Ich weiß, der erste ist der Benutzer und der zweite ist die Gruppe, aber bedeutet das "dieser Benutzer UND JEMAND AUS dieser Gruppe" oder "dieser Benutzer, ABER NUR, WENN ER ZU dieser Gruppe gehört"?
Robo Robok

8

Wie schon gepostet

Alles, was Sie tun müssen, ist, Apache das Eigentum an den Ordnern zu übertragen:

aber ich habe -R für den Befehl chown hinzugefügt : sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage


3
Warum müssen wir dem Herstellerverzeichnis die Erlaubnis geben? Speicher ist sinnvoll, um in Protokolldateien usw. zu schreiben. Aber Anbieter? Warum?
Ali Haris

Wie oben in einem Kommentar geschrieben: "Allerdings müssen sowohl Ihr Computer als auch Ihr Server Apache in der Lage sein, in diese Ordner zu schreiben. Beispiel: Wenn Sie Befehle wie PHP Artisan ausführen, muss Ihr Computer in die Protokolldatei im Speicher schreiben."
Stanislav Potapenko

Fehler auf dem Mac: chown: www-data: illegaler Gruppenname
Sunil Kumar


7

Die meisten Ordner sollten normal "755" und Dateien "644" sein.

Für Laravel müssen einige Ordner für den Webserverbenutzer beschreibbar sein. Sie können diesen Befehl auf Unix-basierten Betriebssystemen verwenden.

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

6

In den Laravel 5.4-Dokumenten heißt es:

Nach der Installation von Laravel müssen Sie möglicherweise einige Berechtigungen konfigurieren. Verzeichnisse innerhalb der storageund der bootstrap/cacheVerzeichnisse sollten von Ihrem Webserver beschreibbar sein, sonst wird Laravel nicht ausgeführt. Wenn Sie die virtuelle Homestead-Maschine verwenden, sollten diese Berechtigungen bereits festgelegt sein.

Auf dieser Seite gibt es viele Antworten, in denen die Verwendung von 777Berechtigungen erwähnt wird. Tu das nicht. Sie würden sich Hackern aussetzen .

Befolgen Sie stattdessen die Vorschläge anderer zum Festlegen von Berechtigungen von 755 (oder restriktiver). Möglicherweise müssen Sie herausfinden, auf welchem ​​Benutzer Ihre App ausgeführt wird, indem Sie sie whoamiim Terminal ausführen und dann den Besitz bestimmter Verzeichnisse mithilfe von ändern chown -R.

Wenn Sie nicht die Berechtigung haben, sudoso viele andere Antworten zu verwenden, benötigen Sie ...

Ihr Server ist wahrscheinlich ein gemeinsam genutzter Host wie Cloudways.

(In meinem Fall hatte ich geklont meine Laravel Anwendung in einen zweiten Cloudways Server von mir, und es war nicht vollständig funktioniert , weil sich die Berechtigungen der storageund bootstrap/cacheVerzeichnisse wurden durcheinander.)

Ich musste verwenden:

Cloudways Platform > Server > Application Settings > Reset Permission

Dann könnte ich php artisan cache:clearim Terminal laufen .


6

Zu composer.json hinzufügen

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

Nach dem composer install


2
Das ist eine schlechte Antwort. Sie sollten 777 niemals für einen Ordner verwenden müssen, wenn Sie den Webserver richtig konfiguriert haben. Die Verwendung von 777 öffnet Ihren Server für jeden Hacker, um eine Datei hochzuladen und diese Datei auszuführen, wenn er weiß, wo der Ordner vorhanden ist.
Mbozwood

2
In Ordnung. Was bieten Sie an?
Davron Achilov

Und wenn ja, wird es richtig sein? chown -R $ USER: www-Datenspeicher, chown -R $ USER: www-Daten Bootstrap / Cache
Davron Achilov

Sehen Sie die richtige Antwort, es enthält alle notwendigen Informationen, die Sie unbedingt in das Post-Update
einfügen können

4

Die von bgles veröffentlichte Lösung ist genau das Richtige für mich, wenn es darum geht, Berechtigungen anfangs korrekt festzulegen (ich verwende die zweite Methode), aber es gibt immer noch potenzielle Probleme für Laravel.

Standardmäßig erstellt Apache Dateien mit 644 Berechtigungen. Das ist also so ziemlich alles im Speicher. Wenn Sie also den Inhalt von Speicher / Framework / Ansichten löschen und über Apache auf eine Seite zugreifen, wird die zwischengespeicherte Ansicht wie folgt erstellt:

-rw-r--r-- 1 www-data www-data 1005 Dec  6 09:40 969370d7664df9c5206b90cd7c2c79c2

Wenn Sie "Artisan Serve" ausführen und auf eine andere Seite zugreifen, erhalten Sie unterschiedliche Berechtigungen, da sich CLI PHP anders als Apache verhält:

-rw-rw-r-- 1 user     www-data 16191 Dec  6 09:48 2a1683fac0674d6f8b0b54cbc8579f8e

An sich ist dies keine große Sache, da Sie dies in der Produktion nicht tun werden. Wenn Apache jedoch eine Datei erstellt, die anschließend vom Benutzer geschrieben werden muss, schlägt dies fehl. Dies kann für Cache-Dateien, zwischengespeicherte Ansichten und Protokolle gelten, wenn die Bereitstellung mit einem angemeldeten Benutzer und Handwerker erfolgt. Ein einfaches Beispiel ist "artisan cache: clear", bei dem keine Cache-Dateien gelöscht werden können, die www-data: www-data 644 sind.

Dies kann teilweise gemildert werden, indem handwerkliche Befehle als WWW-Daten ausgeführt werden. Sie werden also alles tun / skripten wie:

sudo -u www-data php artisan cache:clear

Oder Sie vermeiden die Langeweile und fügen dies Ihren .bash_aliases hinzu:

alias art='sudo -u www-data php artisan'

Dies ist gut genug und beeinträchtigt die Sicherheit in keiner Weise. Das Ausführen von Test- und Hygieneskripten auf Entwicklungsmaschinen macht dies jedoch unhandlich, es sei denn, Sie möchten Aliase einrichten, um 'sudo -u www-data' zum Ausführen von phpunit zu verwenden, und alles andere, mit dem Sie Ihre Builds überprüfen, kann dazu führen, dass Dateien erstellt werden.

Die Lösung besteht darin, dem zweiten Teil der Bgles-Ratschläge zu folgen, Folgendes zu / etc / apache2 / envvars hinzuzufügen und Apache neu zu starten (nicht neu zu laden):

umask 002

Dadurch wird Apache gezwungen, standardmäßig Dateien als 664 zu erstellen. Dies kann an sich ein Sicherheitsrisiko darstellen. In den hier meist diskutierten Laravel-Umgebungen (Homestead, Vagrant, Ubuntu) wird der Webserver jedoch als Benutzer-www-Daten unter der Gruppe www-Daten ausgeführt. Wenn Sie Benutzern also nicht willkürlich erlauben, der www-Datengruppe beizutreten, sollte kein zusätzliches Risiko bestehen. Wenn es jemandem gelingt, aus dem Webserver auszubrechen, hat er ohnehin eine WWW-Datenzugriffsebene, sodass nichts verloren geht (obwohl dies zugegebenermaßen nicht die beste Einstellung in Bezug auf Sicherheit ist). In der Produktion ist es also relativ sicher, und auf einer Einzelbenutzer-Entwicklungsmaschine ist dies einfach kein Problem.

Da sich Ihr Benutzer in der WWW-Datengruppe befindet und alle Verzeichnisse, die diese Dateien enthalten, g + s sind (die Datei wird immer unter der Gruppe des übergeordneten Verzeichnisses erstellt), ist alles, was vom Benutzer oder von WWW-Daten erstellt wird, r /. w für den anderen.

Und das ist das Ziel hier.

bearbeiten

Wenn Sie den obigen Ansatz zum weiteren Festlegen von Berechtigungen untersuchen, sieht er immer noch gut genug aus, aber ein paar Verbesserungen können helfen:

Standardmäßig sind Verzeichnisse 775 und Dateien 664, und alle Dateien haben den Eigentümer und die Gruppe des Benutzers, der gerade das Framework installiert hat. Nehmen wir also an, wir beginnen an diesem Punkt.

cd /var/www/projectroot
sudo chmod 750 ./
sudo chgrp www-data ./

Als erstes blockieren wir den Zugriff auf alle anderen und machen die Gruppe zu WWW-Daten. Nur der Eigentümer und die Mitglieder von www-data können auf das Verzeichnis zugreifen.

sudo chmod 2775 bootstrap/cache
sudo chgrp -R www-data bootstrap/cache

Damit der Webserver services.json und compiled.php erstellen kann, wie im offiziellen Laravel-Installationshandbuch vorgeschlagen. Das Setzen des Gruppen-Sticky-Bits bedeutet, dass diese dem Ersteller mit einer Gruppe von WWW-Daten gehören.

find storage -type d -exec sudo chmod 2775 {} \;
find storage -type f -exec sudo chmod 664 {} \;
sudo chgrp -R www-data storage

Wir machen dasselbe mit dem Speicherordner, um die Erstellung von Cache-, Protokoll-, Sitzungs- und Ansichtsdateien zu ermöglichen. Wir verwenden find, um die Verzeichnisberechtigungen für Verzeichnisse und Dateien explizit unterschiedlich festzulegen. Wir mussten dies nicht in Bootstrap / Cache tun, da dort (normalerweise) keine Unterverzeichnisse vorhanden sind.

Möglicherweise müssen Sie alle ausführbaren Flags erneut anwenden, Vendor / * löschen und Composer-Abhängigkeiten neu installieren, um Links für phpunit et al. Neu zu erstellen, z.

chmod +x .git/hooks/*
rm vendor/*
composer install -o

Das ist es. Mit Ausnahme der oben erläuterten Umask für Apache ist dies alles, was erforderlich ist, ohne dass die gesamte Projektwurzel durch www-Daten beschreibbar ist, was bei anderen Lösungen der Fall ist. Auf diese Weise ist es etwas sicherer, wenn ein Eindringling, der als WWW-Daten ausgeführt wird, einen eingeschränkteren Schreibzugriff hat.

Ende bearbeiten

Änderungen für Systemd

Dies gilt für die Verwendung von php-fpm, aber möglicherweise auch für andere.

Der Standarddienst systemd muss überschrieben, die Umask in der Datei override.conf festgelegt und der Dienst neu gestartet werden:

sudo systemctl edit php7.0-fpm.service
Use:
    [Service]
    UMask=0002
Then:
sudo systemctl daemon-reload
sudo systemctl restart php7.0-fpm.service

3

Das hat bei mir funktioniert:

cd [..LARAVEL PROJECT ROOT]
sudo find . -type f -exec chmod 644 {} \;
sudo find . -type d -exec chmod 755 {} \;
sudo chmod -R 777 ./storage
sudo chmod -R 777 ./bootstrap/cache/

Was es macht:

  • Ändern Sie alle Dateiberechtigungen in 644
  • Ändern Sie alle Ordnerberechtigungen in 755
  • Für den Speicher- und Bootstrap-Cache (spezielle Ordner, die von laravel zum Erstellen und Ausführen von Dateien verwendet werden und von außen nicht verfügbar sind) setzen Sie die Berechtigung für alle internen Elemente auf 777

Hinweis: Möglicherweise können oder müssen Sie dies nicht mit dem Präfix sudo tun. Dies hängt von den Berechtigungen, der Gruppe usw. Ihres Benutzers ab.


2

Ich beschloss, mein eigenes Skript zu schreiben, um die Probleme beim Einrichten von Projekten zu lindern.

Führen Sie in Ihrem Projektstamm Folgendes aus:

wget -qO- https://raw.githubusercontent.com/defaye/bootstrap-laravel/master/bootstrap.sh | sh

Warten Sie, bis das Bootstrapping abgeschlossen ist, und Sie können loslegen.

Überprüfen Sie das Skript vor der Verwendung.


2

Ich habe laravel auf der EC2-Instanz installiert und 3 Tage damit verbracht, den Berechtigungsfehler zu beheben und ihn endlich zu beheben. Deshalb möchte ich diese Erfahrung mit anderen teilen.

  1. Benutzerproblem Wenn ich mich in der ec2-Instanz angemeldet habe, ist mein Benutzername ec2-user und die Benutzergruppe ec2-user. Und die Website funktioniert unter httpd user: apache: apache, daher sollten wir die Berechtigung für Apache festlegen.

  2. Ordner- und Dateiberechtigung A. Zuerst sollten Sie sicherstellen, dass Sie eine solche Ordnerstruktur im Speicher haben

    Lager

    • Rahmen
      • Zwischenspeicher
      • Sitzungen
      • Ansichten
    • Protokolle Die Ordnerstruktur kann je nach verwendeter Laravel-Version unterschiedlich sein. meine laravel version ist 5.2 und du könntest die passende struktur entsprechend deiner version finden.

B. Erlaubnis Zuerst sehe ich die Anweisungen, um 777 unter Speicher zu setzen, um file_put_contents zu entfernen: Fehler beim Öffnen des Streams fehlgeschlagen. Also habe ich die Berechtigung 777 zum Speichern von chmod -R 777-Speicher eingerichtet. Der Fehler wurde jedoch nicht behoben. Hier sollten Sie eines berücksichtigen: Wer schreibt Dateien in Speicher / Sitzungen und Ansichten? Das ist kein ec2-User, sondern Apache. Ja richtig. Der Benutzer "Apache" schreibt eine Datei (Sitzungsdatei, kompilierte Ansichtsdatei) in den Sitzungs- und Ansichtsordner. Sie sollten Apache also die Berechtigung zum Schreiben in diesen Ordner erteilen. Standardmäßig: SELinux sagt, dass der Ordner / var / www vom Apache Deamon schreibgeschützt sein sollte.

Dazu können wir den Selinux auf 0 setzen: setenforce 0

Dies kann das Problem zeitlich lösen, aber dies führt dazu, dass MySQL nicht funktioniert. Das ist also keine so gute Lösung.

Sie können einen Lese- / Schreibkontext für den Speicherordner festlegen mit: (Denken Sie daran, setenforce 1 zu verwenden, um ihn zu testen.)

chcon -Rt httpd_sys_content_rw_t storage/

Dann wird Ihr Problem behoben.

  1. und vergessen Sie nicht dieses Komponisten-Update PHP Artisan Cache: klar

    Diese Befehle sind nach oder vor nützlich.

    Ich hoffe du sparst deine Zeit. Viel Glück. Hacken


Haben Sie versucht, ein Befehlszeilenskript vom Webserver aufzurufen? Ich habe ein Problem, da es keine Ausgabe
druckt

0

Ich hatte die folgende Konfiguration:

  • NGINX (laufender Benutzer: nginx )
  • PHP-FPM

Und die Berechtigungen wurden korrekt angewendet, wie @bgies in der akzeptierten Antwort vorgeschlagen hat. Das Problem in meinem Fall war der ursprünglich konfigurierte laufende Benutzer und die Gruppe von php-fpm, die ursprünglich warapache .

Wenn Sie NGINX mit php-fpm verwenden, sollten Sie die Konfigurationsdatei von php-fpm öffnen:

nano /etc/php-fpm.d/www.config

Der Wert von " Ersetzen userund groupOptionen" durch einen NGINX ist für die Arbeit mit konfiguriert. in meinem Fall waren beide nginx:

... ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx ...

Speichern Sie es und starten Sie die Dienste nginx und php-fpm neu.


0

Für Laravel-Entwickler können Verzeichnisprobleme ein wenig schmerzhaft sein. In meiner Anwendung habe ich Verzeichnisse im laufenden Betrieb erstellt und Dateien erfolgreich in dieses Verzeichnis in meiner lokalen Umgebung verschoben. Dann bekam ich auf dem Server Fehler beim Verschieben von Dateien in ein neu erstelltes Verzeichnis.

Hier sind die Dinge, die ich getan habe und am Ende ein erfolgreiches Ergebnis erzielt habe.

  1. sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \;
    sudo find /path/to/your/laravel/root/directory -type d -exec chmod 775 {} \;
  2. chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/
  3. Beim Erstellen des neuen Verzeichnisses im laufenden Betrieb habe ich den Befehl verwendet mkdir($save_path, 0755, true);

Nachdem ich diese Änderungen auf dem Produktionsserver vorgenommen hatte, habe ich erfolgreich neue Verzeichnisse erstellt und Dateien in diese verschoben.

Wenn Sie die Dateifassade in Laravel verwenden, können Sie Folgendes tun: File::makeDirectory($save_path, 0755, true);


-1

Ich habe eine noch bessere Lösung dafür gefunden. Es wird verursacht, weil PHP standardmäßig als ein anderer Benutzer ausgeführt wird.

Also, um dies zu beheben

sudo nano /etc/php/7.0/fpm/pool.d/www.conf

dann bearbeiten Sie die user = "put user that owns the directories" group = "put user that owns the directories"

dann:

sudo systemctl reload php7.0-fpm


Wenn es dem Besucher der Webseite gelingt, aus dem Webserver auszubrechen, hat er jetzt die Zugriffsrechte des "Benutzers, dem die Verzeichnisse gehören". Wenn es sich bei diesem Benutzer um WWW-Daten handelt, kann er nur eine begrenzte Menge an Schaden anrichten. Aus diesem Grund wird Apache als begrenzter Benutzer ausgeführt. Wenn dieser Benutzer nicht so eingeschränkt ist, kann er mehr Schaden anrichten. Wenn dieser Benutzer Sudo-Rechte hat, kann er viel mehr Schaden anrichten.
Markdwhite

Mit Apache ist es genauso. Übrigens, ich lasse Nignx jetzt wie einen großen Jungen laufen
Cecil Merrel aka Bringrainfire
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.