J'ai un script que j'exécute en utilisant php artisan (avec l' utilisateur root ), et parfois cela provoque la création du fichier journal quotidien avant que l'utilisateur apache www-data ne le fasse - ce qui signifie que lorsqu'un utilisateur réel utilise mon application Web, j'obtiens l'erreur d'autorisation de dossier:
Échec de l'ouverture du flux: autorisation refusée
Je change les permissions en www-data chaque fois, mais je veux résoudre ce problème en créant toujours le fichier journal avec les autorisations appropriées.
J'ai envisagé de créer un travail cron qui crée le fichier ou le touche pour m'assurer qu'il dispose de la bonne autorisation tous les jours, mais je recherche une meilleure solution qui ne repose pas sur un autre script.
Nous avons également envisagé d'encapsuler php artisan dans un autre script pour nous assurer qu'il est toujours exécuté avec les informations d' identification www-data , mais certaines choses que nous voulons faire sont en fait root procédures qu'apache ne devrait pas être autorisé à faire.
D'autres suggestions?
cron
travail danstouch
un nouveau fichier journal à minuit tous les jours (sous le bon utilisateur, bien sûr).php artisan
tant qu'utilisateur pour lequel vous souhaitez créer le fichier journal.sudo crontab -u www-data -e
Réponses:
Commençons par ce qui est constant.
Vous avez une
php artisan
commande, exécutée parroot
.Il est prudent de supposer que cette commande est exécutée quotidiennement.
Solution n ° 1:
Étant donné que l'utilisateur qui crée les fichiers est celui qui a l'autorisation d'y écrire par défaut, nous pouvons séparer les journaux par utilisateur en tant que tels:
App/start/global.php
Si votre www-data utilisateur devait créer un journal d'erreur, il se traduirait par:
storage/logs/laravel-www-data-2015-4-27.log
.Si votre racine utilisateur devait créer un journal d'erreur, il se traduirait par:
storage/logs/laravel-root-2015-4-27.log
.Solution n ° 2:
Modifiez le journal utilisé par votre commande artisan, dans votre script php.
Dans votre
run()
fonction, ajoutez cette ligne au début:Si le nom de votre classe est
ArtisanRunner
, votre fichier journal sera:storage/logs/laravel-ArtisanRunner-2015-4-27.log
.Conclusion: La solution numéro 1 est meilleure, étant donné qu'elle délimite vos journaux par utilisateur et qu'aucune erreur ne se produira.
EDIT: Comme indiqué par jason,
get_current_user()
renvoie le nom du propriétaire du script. Par conséquent, pour que la solution n ° 1 s'applique,chown
vos fichiers de classe artisan au nom d'utilisateur requis.la source
get_current_user()
renvoie le propriétaire du script PHP actuel (selon php.net) et non l'utilisateur qui exécute actuellement le script. J'utilise à laphp_sapi_name()
place, qui donne le nom du gestionnaire php (apache ou cli, par exemple) qui aura tendance à être exécuté en tant qu'utilisateurs différents.Laravel version 5.6.10 et ultérieure prend en charge un
permission
élément dans la configuration (config/logging.php
) pour lesingle
et ledaily
pilote:Pas besoin de jongler avec Monolog dans le script bootstrap.
Plus précisément, la prise en charge a été ajoutée dans https://github.com/laravel/framework/commit/4d31633dca9594c9121afbbaa0190210de28fed8 .
la source
'permission' => 0664
fonctionne pour moi (sans guillemets)Pour Laravel 5.1, j'utilise ce qui suit vers le bas de
bootstrap/app.php
(comme mentionné dans la documentation ):Il existe bien sûr de nombreux autres gestionnaires que vous pouvez utiliser à la place.
la source
À ces fins, vous devez utiliser l'ACL avancée sur vos fichiers et répertoires.
setfacl
serait votre réponse ici. Si vous souhaitez donner à l' utilisateur www-data des autorisations d'écrire sur les fichiers root dans un répertoire spécifique, vous pouvez le faire comme ceci:Après avoir émis cela, vous définissez des autorisations
rwx
pour l' utilisateur www-data sur tous les fichiers,/my/folder/
peu importe qui les a créés. Veuillez lire ceci et cette question pour référence. Vous pouvez également consulter les documents poursetfacl
.Faites-moi savoir si cela vous aide.
la source
setfacl -d -m g:www-data:rw /full/path/to/laravel/storage/logs
suivie dephp artisan cache:clear
etcomposer dump-autoload
.J'ai fait fonctionner cela de manière très simple:
J'ai rencontré le même problème sur Laravel 5.6
Dans
config/logging.php
Je viens de mettre à jour la valeur du chemin de la chaîne quotidienne avecphp_sapi_name()
.Cela crée une durée distincte pour différents php_sapi_name et place le fichier journal avec l'horodatage dans leur répertoire correspondant.
Alors pour moi,
fpm-fcgi
journaux sont créés sous le répertoire: Journaux du site Web,owner: www-data
cli
journaux sont créés sous le répertoire: à partir de la commande artisan (cronjob).owner: root
Plus d'informations sur la journalisation Laravel 5.6: https://laravel.com/docs/5.6/logging
Voici mon
config/logging.php
dossier:la source
artisan config:cache
, car cela créera un cache de configuration en utilisant le cli SAPI qui sera utilisé à la fois pour les requêtes CLI et Web.get_current_user
ne fonctionne pas, maisphp_sapi_name
fonctionne (même si cela semble plus laid)Pour moi, ce problème était bien plus que les autorisations de journal ... J'avais des problèmes avec tout ce qui concernait les dossiers d'amorçage / cache et de stockage où un utilisateur créerait un fichier / dossier et l'autre ne pouvait pas modifier / supprimer en raison de la norme 644 et 755 autorisations.
Les scénarios typiques sont:
Le fichier bootstrap / cache / compiled.php en cours de création par l'utilisateur apache mais non modifiable par l'utilisateur composer lors de l'exécution de la commande d'installation de composer
L'utilisateur apache créant un cache qui ne peut pas être effacé à l'aide de l'utilisateur composer
Le rêve est que quel que soit l'utilisateur qui crée le fichier / dossier, les autres utilisateurs qui doivent y accéder ont exactement les mêmes autorisations que l'auteur d'origine.
TL; DR?
Voici comment procéder.
Nous devons créer un groupe d'utilisateurs partagé appelé laravel, le groupe se compose de tous les utilisateurs qui ont besoin d'accéder aux répertoires de stockage et de bootstrap / cache. Ensuite, nous devons nous assurer que les fichiers et dossiers nouvellement créés disposent respectivement du groupe laravel et des autorisations 664 et 775.
C'est facile de faire cela pour les fichiers / répertoires existants, mais un peu de magie est nécessaire pour modifier les règles de création de fichiers / dossiers par défaut ...
À des fins de débogage, j'ai trouvé que la division des journaux entre les utilisateurs cli / web + était bénéfique, j'ai donc légèrement modifié la réponse de Sam Wilson. Mon cas d'utilisation était la file d'attente exécutée sous son propre utilisateur, ce qui a aidé à faire la distinction entre l'utilisateur compositeur utilisant le cli (par exemple les tests unitaires) et le démon de file d'attente.
la source
configureMonologUsing
code est-il toujours nécessaire une fois que vous avez exécuté lessetfacl
commandes?Laravel 5.1
Dans notre cas, nous voulions créer tous les fichiers journaux afin que tout dans le
deploy
groupe ait des autorisations de lecture / écriture. Par conséquent, nous devions créer tous les nouveaux fichiers avec des0664
autorisations, par opposition à la0644
valeur par défaut.Nous avons également ajouté un formateur pour ajouter des nouvelles lignes pour une meilleure lisibilité:
Il est également possible de combiner cela avec la réponse acceptée
la source
Une manière non-Laravel de faire ce travail est d'exécuter simplement votre cronjob en tant que www-data.
par exemple /ubuntu/189189/how-to-run-crontab-as-userwww-data
la source
Laravel 5.5
Ajoutez ce code à
bootstrap/app.php
:laravel-2018-01-27-cli-raph.log
etlaravel-2018-01-27-fpm-cgi-raph.log
qui est plus lisible.Laravel 5.6
Vous devez créer une classe pour votre enregistreur:
Ensuite, vous devez l'enregistrer dans
config/logging.php
:Même comportement que pour 5.5:
laravel-2018-01-27-cli-raph.log
etlaravel-2018-01-27-fpm-cgi-raph.log
qui est plus lisible.la source
Ajoutez quelque chose comme ce qui suit au début de votre
app/start/artisan.php
fichier (c'est avec Laravel 4):Ajustez le chemin si le fichier journal quotidien que vous mentionnez n'est pas le fichier journal standard de Laravel. Vous pouvez également ne pas vouloir changer le groupe ou définir les autorisations comme je le fais ici. Ce qui précède définit le groupe sur
www-data
et définit les autorisations d'écriture du groupe. J'ai ensuite ajouté mon utilisateur régulier auwww-data
groupe afin que l'exécution de commandes artisanales en tant qu'utilisateur régulier puisse toujours écrire dans le journal.Un ajustement connexe consiste à mettre ce qui suit au début de votre
app/start/global.php
fichier:Si vous faites cela, la
chmod
ligne ci-dessus devient sans objet. Avec umask réglé sur this, tous les nouveaux fichiers créés par PHP (et donc Laravel) verront leurs permissions masquées uniquement pour que les "autres" utilisateurs n'aient pas les permissions d'écriture. Cela signifie que les répertoires démarreront en tant querwxrwxr-x
et les fichiers en tant querw-rw-r--
. Donc, siwww-data
PHP exécute, tout cache et tous les fichiers journaux qu'il crée seront inscriptibles par défaut par n'importe qui dans le groupe principal de cet utilisateur, qui estwww-data
.la source
(Laravel 5.6) J'ai récemment rencontré le même problème et j'ai simplement défini une commande planifiée à exécuter
/app/Console/Kernel.php
.$schedule->exec('chown -R www-data:www-data /var/www/**********/storage/logs')->everyMinute();
Je sais que c'est un peu exagéré, mais cela fonctionne comme un charme et n'a pas eu de problèmes depuis.
la source
Laravel 5.4
\Log::getMonolog()->popHandler(); \Log::useDailyFiles(storage_path('/logs/laravel-').get_current_user().'.log');
ajouter à la
boot
fonction dansAppServiceProvider
la source
Laravel 5.8
Laravel 5.8 vous permet de définir le nom du journal dans
config/logging.php
.Donc, en utilisant les réponses et les commentaires précédents, si vous souhaitez nommer, vous connectez à la fois le nom d'utilisateur posix réel ET le
php_sapi_name()
valeur, il vous suffit de modifier le jeu de noms de journal. L'utilisation du pilote quotidien permet une rotation des journaux qui s'exécute par combinaison utilisateur / api, ce qui garantira que le journal est toujours tourné par un compte qui peut modifier les journaux.J'ai également ajouté une vérification pour les fonctions posix qui peuvent ne pas exister sur votre environnement local, auquel cas le nom du journal par défaut est simplement le standard.
En supposant que vous utilisez le canal de journal par défaut «tous les jours», vous pouvez modifier votre clé «canaux» comme ceci:
Cela se traduira par un nom de journal qui doit être unique pour chaque combinaison, comme
laravel-cli-sfscs-2019-05-15.log
ou enlaravel-apache2handler-apache-2019-05-15.log
fonction de votre point d'accès.la source
Vous pouvez simplement modifier l'autorisation du fichier journal dans votre commande artisan:
où get_current_user () retournera l'utilisateur du script courant.
En d'autres termes,
daily.log
aura toujourswww-data
comme propriétaire, même si vous initialisez le script en tantroot
qu'utilisateur.la source
Si vous utilisez Laravel Envoyer , voici une solution possible en utilisant ACL sous Linux:
1. Tout d'abord, exécutez le script suivant avec les
root
autorisations sur le serveur:2. Configurez le hook de déploiement suivant sur envoyer sous "Activer la nouvelle version"> "Avant cette action
3. Redéployez votre application
Maintenant, redéployez votre application, et cela devrait fonctionner à l'avenir.
la source
la source
Le meilleur moyen que j'ai trouvé est que fideloper suggère, http://fideloper.com/laravel-log-file-name , vous pouvez définir la configuration du journal laravel sans toucher la classe Log. Avoir des noms différents pour les programmes Console et les programmes Http, je pense, est la meilleure solution.
la source
Cette solution fonctionnera définitivement sur Laravel V5.1 - V6.x
Raisons de cette erreur:
.env
fichier introuvable dans votre répertoire racineRéparer:
touch .env
et collez vos variables d'environnement, puis exécutezla source