Comment réparer l'erreur: laravel.log n'a pas pu être ouvert?


186

Je suis assez nouveau chez laravel, en fait et j'essaye de créer mon tout premier projet. pour une raison quelconque, je continue à recevoir cette erreur (je n'ai même pas encore commencé à coder)

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

J'ai lu que cela avait quelque chose à voir avec les autorisations mais chmod -R 775 storagen'a pas du tout aidé.

Autorisations


Êtes-vous sûr d'être dans le bon répertoire lors de l'exécution de cette commande chmod? Essayez chmod -R 755 / var / www / laravel / app / storage. De plus, sur quoi l'utilisateur et le groupe sont-ils définis? Essayez ls -al / var / www / laravel / app / storage
Ryan LaB

mêmes résultats (j'ai mis à jour mon message d'origine pour afficher les autorisations du dossier)
FRR

: / pour une raison quelconque, cela ne fonctionne toujours pas. Je ne l'ai pas mentionné avant, mais j'utilise vagrant. donc mon dossier www est sur une VM (apache, php et tout le reste s'exécute dessus). Je ne sais pas si cela a quelque chose à voir avec quoi que ce soit, mais j'ai pensé le mentionner au cas où. (Je crée mon projet avec le vm, en utilisant le compositeur)
FRR

13
Les gars qui suggèrent 777, essayez google cette phrase: "production db_password filetype: env inurl: com"
Tarasovych

1
La désactivation de SELINUX a fonctionné pour moi.
Prakash P

Réponses:


307

Ne définissez jamais un répertoire sur 777 . vous devez changer la propriété du répertoire. définissez donc votre utilisateur actuel avec lequel vous êtes connecté en tant que propriétaire et l'utilisateur du serveur Web (www-data, apache, ...) en tant que groupe. Vous pouvez essayer ceci:

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

puis pour définir l'autorisation de répertoire, essayez ceci:

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

Mettre à jour:

L'utilisateur et le groupe du serveur Web dépendent de votre serveur Web et de votre système d'exploitation. pour déterminer quel est l'utilisateur et le groupe de votre serveur Web, utilisez les commandes suivantes. pour une utilisation nginx:

ps aux|grep nginx|grep -v grep

pour une utilisation apache:

ps aux | egrep '(apache|httpd)'


4
Merci! Bref vous pouvez aussi faire:sudo chown -R {your current user}:www-data storage bootstrap/cache
Ramesh Pareek

2
@RameshPareek Vous avez raison mais je voulais juste être plus clair;)
Hamid Parchami

1
Cela ne fonctionne pas pour moi. Je viens de comprendre chown: www-data: illegal group name. Définir le répertoire sur 777 est la seule chose qui fonctionne
Matt D

3
@MattD Je suppose que le groupe apache sur mac _wwwessaie ceci sudo chgrp -R _www bootstrap/cache. il serait utile de jeter un œil à cet article: stackoverflow.com/a/6419695/2125114
Hamid Parchami

3
Cela devrait être la réponse choisie, 100% conviennent que les administrateurs système ne devraient pas simplement autoriser l'accès à tout pour éviter de résoudre le vrai problème.
HyperionX

134

N'utilisez jamais 777 pour les répertoires sur votre serveur live, mais sur votre propre machine, nous devons parfois en faire plus que 775, car

chmod -R 775 storage

Veux dire

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

Si votre serveur Web ne fonctionne pas en tant que Vagrant, il ne pourra pas y écrire, vous avez donc 2 options:

chmod -R 777 storage

ou remplacez le groupe par l'utilisateur de votre serveur Web, en supposant que c'est www-data:

chown -R vagrant:www-data storage

Je n'avais pas besoin du chmod dans mon cas car il était déjà réglé correctement, mais sur Fedora 20, il fallait:chown -R apache:apache laravelproject
misterjaytee

J'avais des problèmes pour monter des dossiers via samba / vagrant - chown -R vagrant:www-data storageje l'ai fait pour moi, merci.
Lewis

1
Le stockage chmod -R 777 a fonctionné pour moi. J'ai essayé de changer de groupe, mais j'ai continué à obtenirwww-data: illegal group name
Matt D

58

Pour résoudre ce problème, vous devez changer la propriété du répertoire en l'utilisateur Unix utilisé par le serveur Web.

  1. Sortez de la VM
  2. À l'aide de la console, accédez à votre dossier synchronisé (vagrant)
  3. sudo chown -R $ USER: stockage www-data
  4. stockage chmod -R 775

Même si j'ai créé le projet dans la machine virtuelle en utilisant l'utilisateur de la machine virtuelle, le dossier appartenait à l'utilisateur sur l'ordinateur réel; alors, en essayant de

Maintenant ça marche.

Merci à tous ceux qui m'ont aidé à comprendre cette chose

ÉDITER:

En fait, cela ne fonctionnait toujours pas, cela me posait toujours un problème de "permission refusée".

Voici ce que j'ai fait, j'ai modifié mon Vagrantfile comme ceci:

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

J'ai fait ça ... et JE SUIS GRACE! Toujours pas de travail ... laravel 5 ... renommé le fichier journal, laravel en a créé un nouveau ... même erreur
ied3vil

1
Je n'ai pas config.vm.synced_folder car j'utilise Homestead, comment puis-je résoudre ce problème?
oleynikd

21
Vous ne devriez pas utiliser 777 bon gré mal gré.
IIllIIll

Je ne vois pas de problème lors de l'utilisation de 777 sur un dossier Je sais exactement ce qu'il contient (un exemple de projet factice)
FRR

2
Cela ne devrait absolument pas être la réponse acceptée. C'est terrible. Jamais mis 777. Jamais.
CGriffin

39

Il peut également s'agir de SELinux. (Centos, RedHat)

Déterminez l'état de SElinux sur le terminal:

$ sestatus

Si l'état est activé, écrivez la commande pour désactiver SElinux

$ setenforce Permissive

Ou vous pouvez exécuter cette commande

$ sudo setenforce 0


6
C'est la seule chose qui a fonctionné, pouvez-vous s'il vous plaît expliquer ce que cela fait?
hack4mer

2
@ hack4mer vous pouvez lire plus d'informations sur seLinux. en.wikipedia.org/wiki/Security-Enhanced_Linux
Turan Zamanlı

les choses étranges que j'ai jamais vues, pourquoi diable ça marche après plus de 6 heures de recherche
Muhamad Yulianto

1
La seule solution qui a fonctionné pour moi .. merci. Mais le problème revient à chaque redémarrage du serveur, savez-vous comment le faire appliquer même si le serveur est redémarré?
Juan Angel

1
@JuanAngel vous devez désactiver définitivement le service. ouvrez avec l'éditeur vim / etc / sysconfig / selinux puis changez la directive SELinux = enforcing en SELinux = disabled
Turan Zamanlı

32

Vous devez ajuster les autorisations de storageet bootstrap/cache.

  • cd dans votre projet Laravel.
  • sudo chmod -R 755 storage
  • sudo chmod -R 755 bootstrap/cache

Vous pouvez essayer 777 si 755 ne fonctionne pas. 777 n'est pas sécurisé cependant!

Selon la configuration de votre serveur Web, vous pourrez peut-être être plus précis avec vos autorisations et ne les accorder qu'à l'utilisateur de votre serveur Web. Google WEB SERVER NAME Laravel file permissionspour plus d'informations.

Au moment de la rédaction de cet article, c'est pour Laravel 5.4


14

Ajouter à composer.json

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

Après composer install


12

Exécutez les commandes suivantes et vous pouvez ajouter sudoau démarrage de la commande dépend de votre système:

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

1
N'utilisez jamais 777. Avec les autorisations 777, vous donnez à toute personne disposant d'une connexion un accès complet aux fichiers ou répertoires disposant de ces autorisations. Ils peuvent les modifier comme bon leur semble, y compris de manière malveillante. De nombreux incidents de piratage de compte découlent de 777 autorisations.
Odyssee

8

Pour tous les utilisateurs de Centos 7 dans un contexte Laravel, il n'est pas nécessaire de désactiver Selinux, exécutez simplement ces commandes:

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

Enfin, assurez-vous que vos hôtes, ips et hôtes virtuels sont tous correctement accessibles à distance.

Selinux est destiné à restreindre l'accès même aux utilisateurs root, donc seuls les éléments nécessaires peuvent être accédés, au moins sur un aperçu généraliste, c'est une sécurité supplémentaire, le désactiver n'est pas une bonne pratique, il existe de nombreux liens pour apprendre Selinux, mais pour cela cas, il n'est même pas nécessaire.


Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses aux liens uniquement peuvent devenir invalides si la page liée change. - De l'avis
Patrick Mevzek

Le lien est super explicite, il n'y a pas besoin d'un tel mécanisme, il y a même une section spécifiquement pour un contexte Laravel SELinux. Je pense que votre opinion devrait être étayée par un peu plus de logique qu'une simple règle empirique. En attendant, vous avez décliné une réponse qui résoudra probablement à 99% les problèmes sans respecter de mauvaises pratiques telles que la désactivation de Selinux.
Daniel Santos

Ce n'est pas un problème d'être explicite ou non. L'idée de ce site est qu'il contient toutes les informations pertinentes, donc en lisant une réponse, nous obtenons tout cela. Les liens externes peuvent pourrir et la réponse devient alors sans valeur. Ceci est expliqué dans le centre d'aide à stackoverflow.com/help/how-to-answer : "Les liens vers des ressources externes sont encouragés, mais veuillez ajouter du contexte autour du lien afin que vos collègues utilisateurs aient une idée de ce que c'est et pourquoi il est là . Citez toujours la partie la plus pertinente d'un lien important, au cas où le site cible serait inaccessible ou serait définitivement hors ligne. "
Patrick Mevzek

Votre question a été signalée pour examen, c'est tout. Et cela contredit ce qui est écrit dans le centre d'aide que j'ai cité. Toutes les réponses avec juste un lien et aucune description sont rejetées et même supprimées. N'hésitez pas à modifier votre réponse pour fournir la partie pertinente de l'explication ici. Et vous êtes libre de voter contre toutes les réponses que vous jugez mauvaises. Vous pouvez voir sur le lien d'examen que je n'étais pas le seul à recommander que votre réponse soit fermée. Pas sur des mérites techniques, juste parce qu'un lien ne suffit pas.
Patrick Mevzek

Merci pour la clarification, je ne savais pas que ce genre de directives existait, ou si même si, lors du processus d'inscription, vous obtenez un conseil pour lire les ressources, je ne m'en souviens pas. Ce que vous avez dit est peut-être vrai, le lien peut pourrir, mais une réponse peut être atteinte sans effort, peu importe, je la modifierai.
Daniel Santos

6

Si vous utilisez cmd

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

Si vous utilisez GUI

Allez d'abord dans le projet et faites un clic droit sur le stockage et vérifiez les propriétés et allez dans l'onglet Permissions

entrez la description de l'image ici

Modifiez les autorisations en utilisant le code ci-dessous

sudo chmod -R 777 storage

Ensuite, les propriétés de votre fichier peuvent être

entrez la description de l'image ici

Ensuite, vérifiez vos paramètres et exécutez la commande laravel cela fonctionnera :)


Merci yoouuuuuu
viniciussvl

5

Dans Laravel, vous devez définir ACL sur storageet cacherépertoire afin que l'utilisateur du serveur Web puisse lire / écrire sur le répertoire. Ouvrez un nouveau terminal et exécutez ce qui suit:

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/

Références:

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

Il peut être tard mais peut aider quelqu'un, changer les autorisations de répertoire a fonctionné pour moi.

En supposant que votre projet Laravel est dans le /var/www/html/répertoire. Accédez à ce répertoire.

cd /var/www/html/

Modifiez ensuite les autorisations des répertoires storage/et 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

Cette solution est spécifique pour laravel 5.5

Vous devez changer les permissions de quelques dossiers: chmod -R -777 storage / logs chmod -R -777 storage / framework pour les dossiers ci-dessus 775 ou 765 n'a pas fonctionné pour mon projet

chmod -R 775 bootstrap/cache 

La propriété du dossier du projet doit également être la suivante (utilisateur actuel) :( utilisateur du serveur Web)



1

Je n'étais pas trop désireux de changer mes autorisations de dossier en 777. Voici comment j'ai résolu ce problème.

Tout d'abord, j'ai changé l'utilisateur qui exécute le serveur Web sur ma machine locale (j'exécute nginx, mais les principes s'appliquent partout):

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

Ensuite, j'ai créé un autre index.phpfichier dans le public/dossier pour savoir qui exécutait ma version php-fpm et où j'allais changer cela:

<?php
phpinfo();
?>

En rechargeant la page, j'ai découvert que www-datac'était l'utilisateur (sous la section environnement). J'ai également découvert que j'utilisais php 7.1. J'ai procédé au changement d'utilisateur:

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

Enfin, j'ai donné les autorisations suivantes aux dossiers:

sudo chmod -R 775 ./storage/

Maintenant, je me suis assuré que j'étais le propriétaire des dossiers en utilisant un simple:

ls -al

Si vous définissez le serveur et les utilisateurs php-fpm sur vous-même et que les dossiers appartiennent à root par exemple, vous continuerez à rencontrer ce problème. Cela peut arriver si vous avez effectué un sudo laravel new <project>fichier en tant que root. Dans ce cas, assurez-vous d'utiliser une chowncommande récursive sur votre projet pour modifier les user:groupparamètres. Dans la plupart des cas par défaut, www-dataest le paramètre principal pour le serveur et php, dans ce cas, il s'agit de s'assurer que le dossier n'est pas hors de www-dataportée.

Mon projet est installé dans mon répertoire personnel. Sur Ubuntu 16.04 et Laravel 5.5.


1

essaye ça

  1. cd / var / www / html
  2. setenforce 0
  3. redémarrage du service httpd

Pouvez-vous expliquer ce que cela fait?
Increasingly Idiotic

1
Pas besoin de changer de répertoire à utiliser, setenforcemais dans tous les cas, il est faux de désactiver complètement SELinux juste pour résoudre un problème d'autorisation.
Patrick Mevzek

0

Dans mon cas particulier, j'avais un fichier de configuration généré et mis en cache dans le bootstrap/cache/répertoire, donc mes étapes étaient les suivantes:

  1. Supprimez tous les fichiers en cache générés: rm bootstrap/cache/*.php
  2. Créez un nouveau laravel.logfichier et appliquez la mise à jour des permissions sur le fichier en utilisant:

    • chmod -R 775 storage

0

(sur Ubuntu ): peut être résolu en 2 étapes simples:

$ sudo chmod -R 777 storage 

Et

$ sudo service apache2 restart

Étape 3: faites pirater votre serveur et / ou vos utilisateurs parce que vous avez ouvert vos fichiers au monde.
miken32

0

Supprimer "/var/www/laravel/app/storage/logs/laravel.log"et réessayer:

rm storage/logs/laravel.log



-1

Cette erreur peut être corrigée en désactivant Linux.

Vérifiez s'il a été activé

sestatus

Tu essayes..

setenforce 0


5
"en désactivant Linux "? Cela va sérieusement trop loin :-)!
Patrick Mevzek

-1

Pour cette erreur:

Erreur dans le gestionnaire d'exceptions: le flux ou le fichier "/var/www/laravel/app/storage/logs/laravel.log" n'a pas pu être ouvert: échec de l'ouverture du flux: autorisation refusée dans / var / www / laravel / bootstrap / compiled .php: 8423

utilisez cette commande dans le terminal:

sudo chmod -R 777 storage

2
dommage pour la production env
Ariful Haque

-1

Correction de mon problème avec cette commande dans le serveur centos 7.6

chcon -R -t httpd_sys_content_t $SITE_PATH

chcon -R -t httpd_sys_rw_content_t $SITE_PATH
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.