Ich habe ein Skript, das ich mit PHP Artisan (mit Root- Benutzer) ausführe , und manchmal wird die tägliche Protokolldatei erstellt, bevor der Apache - Benutzer www-data dies tut. Das bedeutet, dass ich bekomme, wenn ein echter Benutzer meine Webanwendung verwendet der Ordnerberechtigungsfehler:
Fehler beim Öffnen des Streams: Berechtigung verweigert
Ich ändere die Berechtigungen jedes Mal wieder auf www-data , möchte dies jedoch lösen, indem die Protokolldatei immer mit den richtigen Berechtigungen erstellt wird.
Ich habe überlegt, einen Cron-Job zu erstellen, der die Datei erstellt oder berührt, um sicherzustellen, dass sie jeden Tag die richtige Berechtigung hat, aber ich suche nach einer besseren Lösung, die nicht auf einem anderen Skript basiert.
Wir haben auch darüber nachgedacht, PHP Artisan in ein anderes Skript zu packen, um sicherzustellen, dass es immer mit den Anmeldeinformationen für www-Daten ausgeführt wird. Wir möchten jedoch tatsächlich Root- Prozeduren ausführen, die Apache nicht ausführen darf.
Noch Vorschläge?
cron
Job intouch
einer neuen Protokolldatei ein (natürlich unter dem richtigen Benutzer).php artisan
als Benutzer ausgeführt werden, für den Sie die Protokolldatei erstellen möchten.sudo crontab -u www-data -e
Antworten:
Beginnen wir mit dem, was konstant ist.
Sie haben einen
php artisan
Befehl, der von ausgeführt wirdroot
.Es ist davon auszugehen, dass dieser Befehl täglich ausgeführt wird.
Lösung Nr. 1:
Da der Benutzer, der die Dateien erstellt, standardmäßig die Berechtigung zum Schreiben hat, können wir die Protokolle nach Benutzern als solche trennen:
App/start/global.php
Wenn Ihr WWW-Datenbenutzer ein Fehlerprotokoll erstellen würde, würde dies zu Folgendem führen :
storage/logs/laravel-www-data-2015-4-27.log
.Wenn Ihr Root- Benutzer ein Fehlerprotokoll erstellen würde, würde dies zu Folgendem führen :
storage/logs/laravel-root-2015-4-27.log
.Lösung Nr. 2:
Ändern Sie das von Ihrem Handwerkerbefehl verwendete Protokoll in Ihrem PHP-Skript.
Fügen Sie in Ihrer
run()
Funktion diese Zeile am Anfang hinzu:Wenn der Name Ihrer Klasse lautet
ArtisanRunner
, lautet Ihre Protokolldatei:storage/logs/laravel-ArtisanRunner-2015-4-27.log
.Schlussfolgerung: Lösung Nummer 1 ist besser, da sie Ihre Protokolle nach Benutzer abgrenzt und daher keine Fehler auftreten.
BEARBEITEN: Gibt
get_current_user()
den Besitzernamen des Skripts zurück , wie von Jason hervorgehoben . Damit die Lösung Nr. 1 angewendet werden kann, müssenchown
Ihre Handwerkerklassendateien den erforderlichen Benutzernamen haben.quelle
get_current_user()
der Eigentümer des aktuellen PHP-Skripts (laut php.net) und nicht der Benutzer zurückgegeben wird , der das Skript derzeit ausführt . Ich verwendephp_sapi_name()
stattdessen den Namen des PHP-Handlers (z. B. Apache oder CLI), der in der Regel als unterschiedliche Benutzer ausgeführt wird.Laravel Version 5.6.10 und höher unterstützt ein
permission
Element in der Konfiguration (config/logging.php
) für densingle
und dendaily
Treiber:Sie müssen im Bootstrap-Skript nicht mit Monolog jonglieren.
Insbesondere wurde Unterstützung in https://github.com/laravel/framework/commit/4d31633dca9594c9121afbbaa0190210de28fed8 hinzugefügt .
quelle
'permission' => 0664
funktioniert für mich (ohne Anführungszeichen)Für Laravel 5.1 verwende ich Folgendes unten
bootstrap/app.php
(wie in den Dokumenten erwähnt ):Es gibt natürlich viele andere Handler, die Sie stattdessen verwenden können.
quelle
Für solche Zwecke sollten Sie erweiterte ACL für Ihre Dateien und Verzeichnisse verwenden.
setfacl
wäre deine Antwort hier. Wenn Sie den Benutzern von www-data die Berechtigung zum Schreiben in die Root- Dateien in einem bestimmten Verzeichnis erteilen möchten , können Sie dies folgendermaßen tun:Nachdem Sie dies erteilt haben, legen Sie die Berechtigungen
rwx
für den Benutzer von www-data für alle Dateien fest,/my/folder/
unabhängig davon, wer diese erstellt hat. Bitte lesen Sie diese und diese Frage als Referenz. Sie können auch Dokumente aufsetfacl
überprüfen .Lassen Sie mich wissen, ob das hilft.
quelle
setfacl -d -m g:www-data:rw /full/path/to/laravel/storage/logs
gefolgt vonphp artisan cache:clear
undcomposer dump-autoload
.Ich hatte das sehr einfach gemacht:
Ich bin auf Laravel 5.6 auf dasselbe Problem gestoßen
In
config/logging.php
Ich habe gerade den Pfadwert des täglichen Kanals mit aktualisiertphp_sapi_name()
.Dadurch wird ein separates Verzeichnis für verschiedene php_sapi_name erstellt und die Protokolldatei mit dem Zeitstempel in ihrem jeweiligen Verzeichnis abgelegt.
Also für mich,
fpm-fcgi
Verzeichnis erstellt: Protokolle von der Website,owner: www-data
cli
Verzeichnis erstellt: über den Befehl handwerker (cronjob).owner: root
Weitere Informationen zur Laravel 5.6-Protokollierung: https://laravel.com/docs/5.6/logging
Hier ist meine
config/logging.php
Datei:quelle
artisan config:cache
, da mit der CLI-SAPI ein Konfigurationscache erstellt wird, der sowohl für CLI- als auch für Webanforderungen verwendet wird.get_current_user
funktioniert nicht, aberphp_sapi_name
funktioniert (obwohl es hässlicher erscheint)Für mich war dieses Problem viel mehr als Protokollberechtigungen ... Ich hatte Probleme mit irgendetwas im Zusammenhang mit den Bootstrap- / Cache- und Speicherordnern, bei denen ein Benutzer eine Datei / einen Ordner erstellen und der andere aufgrund des Standards nicht bearbeiten / löschen konnte 644 und 755 Berechtigungen.
Typische Szenarien sind:
Die Datei bootstrap / cache / compiled.php wird vom Apache-Benutzer erstellt, kann jedoch vom Composer-Benutzer beim Ausführen des Composer-Installationsbefehls nicht bearbeitet werden
Der Apache-Benutzer erstellt einen Cache, der mit dem Composer-Benutzer nicht gelöscht werden kann
Der Traum ist, dass unabhängig davon, welcher Benutzer die Datei / den Ordner erstellt, die anderen Benutzer, auf die zugegriffen werden muss, genau die gleichen Berechtigungen wie der ursprüngliche Autor haben.
TL; DR?
Hier ist, wie es gemacht wird.
Wir müssen eine gemeinsam genutzte Benutzergruppe namens laravel erstellen. Die Gruppe besteht aus allen Benutzern, die Zugriff auf die Speicher- und Bootstrap / Cache-Verzeichnisse benötigen. Als Nächstes müssen wir sicherstellen, dass neu erstellte Dateien und Ordner die Berechtigungen laravel group und 664 bzw. 775 haben.
Es ist einfach, dies für vorhandene Dateien / Verzeichnisse zu tun, aber ein wenig Magie ist erforderlich, um die Standardregeln zum Erstellen von Dateien / Ordnern zu optimieren ...
Rein für Debugging-Zwecke fand ich, dass es vorteilhaft war, die Protokolle in beide cli / web + -Nutzer aufzuteilen, sodass ich Sam Wilsons Antwort leicht modifizierte. Mein Anwendungsfall war, dass die Warteschlange unter einem eigenen Benutzer ausgeführt wurde, sodass zwischen dem Composer-Benutzer, der die CLI (z. B. Komponententests) verwendet, und dem Warteschlangendämon unterschieden werden konnte.
quelle
configureMonologUsing
Code nach dem Ausführen dersetfacl
Befehle noch erforderlich ?Laravel 5.1
In unserem Fall wollten wir alle Protokolldateien so erstellen, dass alle Mitglieder der
deploy
Gruppe über Lese- / Schreibberechtigungen verfügen. Daher mussten wir alle neuen Dateien mit0664
Berechtigungen erstellen , im Gegensatz zur0644
Standardeinstellung.Wir haben auch einen Formatierer hinzugefügt, um Zeilenumbrüche für eine bessere Lesbarkeit hinzuzufügen:
Es ist auch möglich, dies mit der akzeptierten Antwort zu kombinieren
quelle
Eine Möglichkeit, diese Arbeit ohne Laravel zu erledigen, besteht darin, Ihren Cronjob einfach als WWW-Daten auszuführen.
zB /ubuntu/189189/how-to-run-crontab-as-userwww-data
quelle
Laravel 5.5
Fügen Sie diesen Code hinzu zu
bootstrap/app.php
:laravel-2018-01-27-cli-raph.log
undlaravel-2018-01-27-fpm-cgi-raph.log
die besser lesbar sind.Laravel 5.6
Sie müssen eine Klasse für Ihren Logger erstellen :
Dann müssen Sie es registrieren in
config/logging.php
:Gleiches Verhalten wie bei 5.5:
laravel-2018-01-27-cli-raph.log
undlaravel-2018-01-27-fpm-cgi-raph.log
die besser lesbar sind.quelle
Fügen Sie am Anfang Ihrer
app/start/artisan.php
Datei Folgendes hinzu (dies ist bei Laravel 4 der Fall):Passen Sie den Pfad an, wenn die von Ihnen erwähnte tägliche Protokolldatei nicht die Standard-Laravel-Protokolldatei ist. Möglicherweise möchten Sie auch nicht die Gruppe ändern oder die Berechtigungen festlegen, wie ich es hier tue. Mit dem obigen Befehl wird die Gruppe auf
www-data
und die Gruppenschreibberechtigungen festgelegt. Ich habe dann meinen regulären Benutzer zurwww-data
Gruppe hinzugefügt, damit das Ausführen von Handwerkerbefehlen als regulärer Benutzer weiterhin in das Protokoll schreiben kann.Eine verwandte Optimierung besteht darin, Folgendes an den Anfang Ihrer
app/start/global.php
Datei zu setzen:Wenn Sie dies tun, wird die
chmod
obige Zeile streitig. Wenn die Umask so eingestellt ist, werden für alle neuen Dateien, die PHP (und damit auch für Laravel) erstellt, die Berechtigungen nur maskiert, damit "andere" Benutzer keine Schreibberechtigungen haben. Dies bedeutet, dass Verzeichnisse alsrwxrwxr-x
und Dateien als beginnenrw-rw-r--
. Wennwww-data
also PHP ausgeführt wird, können alle erstellten Cache- und Protokolldateien standardmäßig von jedem in der Hauptgruppe des Benutzers geschrieben werdenwww-data
.quelle
(Laravel 5.6) Ich bin kürzlich auf dasselbe Problem gestoßen und habe einfach einen geplanten Befehl zum Ausführen festgelegt
/app/Console/Kernel.php
.$schedule->exec('chown -R www-data:www-data /var/www/**********/storage/logs')->everyMinute();
Ich weiß, dass es ein bisschen übertrieben ist, aber es funktioniert wie ein Zauber und hat seitdem keine Probleme mehr gehabt.
quelle
Laravel 5.4
\Log::getMonolog()->popHandler(); \Log::useDailyFiles(storage_path('/logs/laravel-').get_current_user().'.log');
zur
boot
Funktion hinzufügen inAppServiceProvider
quelle
Laravel 5.8
Mit Laravel 5.8 können Sie den Protokollnamen festlegen
config/logging.php
.Wenn Sie also unter Verwendung vorheriger Antworten und Kommentare Ihr Protokoll sowohl mit dem tatsächlichen Posix-Benutzernamen als auch mit dem
php_sapi_name()
Wert benennen möchten , müssen Sie nur den Protokollnamensatz ändern. Die Verwendung des täglichen Treibers ermöglicht die Protokollrotation, die pro Benutzer / API-Kombination ausgeführt wird. Dadurch wird sichergestellt, dass das Protokoll immer von einem Konto gedreht wird, das die Protokolle ändern kann.Ich habe auch eine Überprüfung für die Posix-Funktionen hinzugefügt, die in Ihrer lokalen Umgebung möglicherweise nicht vorhanden sind. In diesem Fall wird der Protokollname standardmäßig verwendet.
Angenommen, Sie verwenden den Standardprotokollkanal "täglich", können Sie den Schlüssel "Kanäle" folgendermaßen ändern:
Dies führt zu einem Protokollnamen, der für jede Kombination eindeutig sein sollte, z. B.
laravel-cli-sfscs-2019-05-15.log
oderlaravel-apache2handler-apache-2019-05-15.log
abhängig von Ihrem Zugriffspunkt.quelle
Sie können einfach die Berechtigung der Protokolldatei in Ihrem handwerklichen Befehl ändern:
Dabei gibt get_current_user () den Benutzer des aktuellen Skripts zurück.
Mit anderen Worten,
daily.log
wird immerwww-data
als Eigentümer haben, auch wenn Sie das Skript alsroot
Benutzer initialisieren .quelle
Wenn Sie Laravel Envoyer verwenden , gibt es hier eine mögliche Lösung für die Verwendung von ACL unter Linux:
1. Führen Sie zunächst das folgende Skript mit
root
Berechtigungen auf dem Server aus:2. Richten Sie den folgenden Bereitstellungs-Hook im Envoyer unter "Neue Version aktivieren"> "Vor dieser Aktion" ein
3. Stellen Sie Ihre Anwendung erneut bereit
Stellen Sie jetzt Ihre Anwendung erneut bereit, und sie sollte in Zukunft funktionieren.
quelle
quelle
Der beste Weg, den ich gefunden habe, ist, dass fideloper vorschlägt, http://fideloper.com/laravel-log-file-name , Sie können die Laravel-Protokollkonfiguration festlegen, ohne die Protokollklasse zu berühren. Ich denke, es ist die beste Lösung, unterschiedliche Namen für Konsolenprogramme und HTTP-Programme zu haben.
quelle
Diese Lösung funktioniert definitiv unter Laravel V5.1 - V6.x.
Gründe für diesen Fehler:
.env
Datei nicht in Ihrem Stammverzeichnis gefundenFix:
touch .env
fügen Sie Ihre Umgebungsvariablen ein und führen Sie sie ausquelle