Comment configurer les autorisations de fichiers pour Laravel?

235

J'utilise Apache Web Server dont le propriétaire est défini sur _www:_www. Je ne sais jamais quelle est la meilleure pratique avec les autorisations de fichiers, par exemple lorsque je crée un nouveau projet Laravel 5.

Laravel 5 nécessite que le /storagedossier soit accessible en écriture. J'ai trouvé beaucoup d'approches différentes pour le faire fonctionner et je finis généralement par le faire 777récursivement. Je sais que ce n'est pas la meilleure idée.

Le doc officiel dit:

Laravel peut nécessiter certaines autorisations pour être configuré: les dossiers à l'intérieur storageet vendornécessitent un accès en écriture par le serveur Web.

Cela signifie-t-il que le serveur Web doit également accéder aux dossiers storageet vendoreux-mêmes ou uniquement à leur contenu actuel?

Je suppose que ce qui est beaucoup mieux, c'est de changer le propriétaire au lieu des autorisations. J'ai changé toutes les autorisations de fichiers de Laravel de manière récursive en _www:_wwwet cela a fait fonctionner le site correctement, comme si j'avais changé chmod en 777. Le problème est que mon éditeur de texte me demande maintenant un mot de passe chaque fois que je veux enregistrer un fichier et la même chose se produit si j'essaie de changer quoi que ce soit dans le Finder, comme par exemple copier un fichier.

Quelle est la bonne approche pour résoudre ces problèmes?

  1. Changement chmod
  2. Modifiez le propriétaire des fichiers pour qu'ils correspondent à ceux du serveur Web et définissez peut-être l'éditeur de texte (et le Finder?) Pour ignorer la demande de mot de passe ou les faire utiliser sudo
  3. Changer le propriétaire du serveur Web pour correspondre à l'utilisateur du système d'exploitation (je ne connais pas les conséquences)
  4. Autre chose
Robo Robok
la source
4
Je pense que 777c'est trop de liberté, car cela inclut toutes les autorisations pour tout le monde.
Robo Robok
Depuis les documents Laravel: les répertoires dans le storageet les bootstrap/cacherépertoires doivent être accessibles en écriture par votre serveur Web
joshuamabina
1
utilisez fcgi et vous pouvez 755/644 pour tous (y compris public / stockage)
Jeffz
@jww convient-il que nous puissions déplacer la question en erreur serveur au lieu de la mettre en attente?
wp78de

Réponses:

589

Juste pour indiquer l'évidence pour quiconque consulte cette discussion .... si vous accordez à l'un de vos dossiers les autorisations 777, vous autorisez TOUT LE MONDE à lire, écrire et exécuter n'importe quel fichier de ce répertoire .... ce que cela signifie, c'est que vous avez donné N'IMPORTE QUI (n'importe quel pirate informatique ou personne malveillante dans le monde entier) permission de télécharger N'IMPORTE QUEL fichier, virus ou tout autre fichier, puis exécutez ce fichier ...

SI VOUS DÉFINISSEZ VOS AUTORISATIONS DE DOSSIER À 777, VOUS AVEZ OUVERT VOTRE SERVEUR À QUICONQUE QUI PEUT TROUVER CE RÉPERTOIRE. Suffisamment clair??? :)

Il existe essentiellement deux façons de configurer votre propriété et vos autorisations. Soit vous vous en donnez la propriété, soit vous rendez le serveur Web propriétaire de tous les fichiers.

Serveur Web en tant que propriétaire (comme le font la plupart des gens et à la manière du Laravel doc):

en supposant que www-data (cela pourrait être autre chose) est votre utilisateur de serveur Web.

sudo chown -R www-data: répertoire www-data / path / to / your / laravel / root /

si vous faites cela, le serveur Web possède tous les fichiers, et est également le groupe, et vous aurez des problèmes pour télécharger des fichiers ou travailler avec des fichiers via FTP, car votre client FTP sera connecté en tant que vous, pas votre serveur Web, alors ajoutez votre utilisateur au groupe d'utilisateurs du serveur Web:

sudo usermod -a -G www-data ubuntu

Bien sûr, cela suppose que votre serveur Web s'exécute en tant que www-data (la valeur par défaut de Homestead) et que votre utilisateur est ubuntu (c'est vagabond si vous utilisez Homestead).

Ensuite, vous définissez tous vos répertoires sur 755 et vos fichiers sur 644 ...

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

SET autorisations de répertoire

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

Votre utilisateur en tant que propriétaire

Je préfère posséder tous les répertoires et fichiers (cela rend le travail avec tout beaucoup plus facile), donc je fais:

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

Ensuite, je me donne moi-même et les autorisations de serveur Web:

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 {} \;

Donnez ensuite au serveur Web les droits de lecture et d'écriture sur le stockage et le cache

Quelle que soit la façon dont vous le configurez, vous devez alors donner des autorisations de lecture et d'écriture au serveur Web pour le stockage, le cache et tous les autres répertoires que le serveur Web doit télécharger ou écrire également (selon votre situation), alors exécutez les commandes de bashy ci-dessus:

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

Maintenant, vous êtes sécurisé et votre site Web fonctionne ET vous pouvez travailler avec les fichiers assez facilement

bgies
la source
4
Excellent exemple, s'il n'y a pas d'utilisateur www-data, utilisez apache: apache à la place de www-data (sur certaines distributions)
Denis Solakovic
53
Je pense que les gens comprennent trop mal le anyoneconcept. Le anyonedrapeau de Linux signifie n'importe quel utilisateur , pas n'importe qui. Vous avez toujours besoin d'un accès au serveur.
Marco Aurélio Deleu
3
@ andreshg112 Le premier www-data est le nom de l'utilisateur, et le second www-data est le nom du groupe. Cela signifie donc que le propriétaire est apache et (ce groupe) apache. Utilisez www-data: www-data ou ajoutez votre utilisateur à ce groupe. (CLI: useradd -G {nom_groupe} nom_utilisateur), et que vous pouvez voir sur nom_utilisateur: www-group
Denis Solakovic
2
@fs_tigre Je ne pense pas qu'il y ait beaucoup de différence pour la sécurité ... sauf que je suppose qu'il y a deux utilisateurs pour deviner les mots de passe au lieu d'un, et bien sûr je me connecte tout le temps avec mon compte utilisateur, donc si Je l'ai fait de manière non sécurisée (FTP normal et en utilisant un mot de passe par exemple), cela pourrait compromettre le site, mais je ne me connecte qu'avec Putty et SSH, et quand j'utilise FTP c'est SFTP, donc pas de problème du tout. Les commandes suggérées par bashy sont recommandées car elles définissent le bit collant, donc si votre serveur Web crée des sous-répertoires, il aura le même propriétaire / les mêmes autorisations que le parent
bgies
3
Dans la première méthode, l'utilisateur ne serait-il toujours pas en mesure de télécharger des fichiers puisque vous n'avez pas writeautorisé le groupe?
Fahmi
44

Les autorisations pour les dossiers storageet vendordoivent rester 775, pour des raisons de sécurité évidentes.

Cependant, à la fois votre ordinateur et votre serveur Apache doivent pouvoir écrire dans ces dossiers. Ex: lorsque vous exécutez des commandes comme php artisan, votre ordinateur doit écrire dans le fichier journal storage.

Il vous suffit de donner la propriété des dossiers à Apache:

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

Ensuite, vous devez ajouter votre ordinateur (référencé par c'est username) au groupe auquel appartient le serveur Apache. Ainsi :

sudo usermod -a -G www-data userName

NOTE: Le plus souvent, groupNameest , www-datamais dans votre cas, le remplacer par_www

BassMHL
la source
11
+1 J'aime cette approche. Mais je crois que les chowncommandes devraient inclure le drapeau -R. De plus, dans laravel 5.1 et 5.2, au lieu du répertoire du vendeur, vous devez donner accès au répertoire bootstrap / cache.
Jason Wheeler
existe-t-il un moyen de tester si cela fonctionnera bien? Je veux dire si le nouveau fichier journal est créé dans le répertoire de stockage / logs qui aurait les autorisations correctes, comment puis-je vérifier cela?
Chaudhry Waqas
20

Nous avons rencontré de nombreux cas marginaux lors de la configuration des autorisations pour les applications Laravel. Nous créons un compte utilisateur distinct ( deploy) pour posséder le dossier d'application Laravel et exécuter les commandes Laravel à partir de la CLI, et exécutons le serveur Web sous www-data. Un problème que cela provoque est que le ou les fichiers journaux peuvent appartenir à, www-dataou deploy, selon la première personne qui y a écrit, ce qui empêche évidemment l'autre utilisateur d'y écrire à l'avenir.

J'ai trouvé que la seule solution saine et sûre est d'utiliser les ACL Linux. Le but de cette solution est:

  1. Pour permettre à l'utilisateur qui possède / déploie l'application d'accéder en lecture et en écriture au code de l'application Laravel (nous utilisons un utilisateur nommé deploy).
  2. Pour permettre à l' www-datautilisateur d'accéder en lecture au code d'application Laravel, mais pas en écriture.
  3. Pour empêcher tout autre utilisateur d'accéder au code / aux données de l'application Laravel.
  4. Pour permettre à la fois l' www-datautilisateur et l'utilisateur de l' application ( deployaccès en écriture dans le dossier de stockage), quel que soit l' utilisateur qui possède le fichier (donc à la fois deployet www-datapeut écrire dans le même fichier journal par exemple).

Nous accomplissons cela comme suit:

  1. Tous les fichiers dans le application/dossier sont créés avec le umask par défaut de 0022, ce qui entraîne des dossiers avec des drwxr-xr-xautorisations et des fichiers -rw-r--r--.
  2. sudo chown -R deploy:deploy application/(ou simplement déployer votre application en tant deployqu'utilisateur, c'est ce que nous faisons).
  3. chgrp www-data application/pour donner au www-datagroupe l'accès à l'application.
  4. chmod 750 application/pour autoriser l' deployutilisateur en lecture / écriture, l' www-datautilisateur en lecture seule et pour supprimer toutes les autorisations à tout autre utilisateur.
  5. setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/pour définir les autorisations par défaut sur le storage/dossier et tous les sous-dossiers. Tout nouveau dossier / fichier créé dans le dossier de stockage héritera de ces autorisations ( rwxpour www-dataet pour deploy).
  6. setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/ pour définir les autorisations ci-dessus sur tous les fichiers / dossiers existants.
Chris Schwerdt
la source
15

Modifiez les autorisations de votre dossier de projet pour activer la lecture / écriture / exécution pour tout utilisateur du groupe propriétaire du répertoire (ce qui dans votre cas est _www):

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

Ajoutez ensuite votre nom d'utilisateur OS X au _wwwgroupe pour lui permettre d'accéder au répertoire:

sudo dseditgroup -o edit -a yourusername -t user _www
Bogdan
la source
Lorsque je dseditgroupfourni par vous, je reçois une erreur: Username and password must be provided..
Robo Robok
Mon erreur, vous devez exécuter cette commande avec un utilisateur disposant des autorisations appropriées, il vous suffit donc d'ajouter sudoau début.
Bogdan
Dois-je donc changer le propriétaire de ces fichiers en _www:_wwwou myuser:_wwwaussi?
Robo Robok
Vous pouvez le laisser _www:_www, car 775 signifie que tout utilisateur du groupe _wwwaura les autorisations complètes pour lire / écrire / exect dans ce dossier, et vous venez d'ajouter votre nom d'utilisateur à ce groupe.
Bogdan
Pourriez-vous me dire une chose? Qu'est-ce que cela signifie chown myuser:_www? Je sais que le premier est l'utilisateur et le second est le groupe, mais cela signifie-t-il «cet utilisateur ET TOUTE PERSONNE DE CE GROUPE» ou «cet utilisateur MAIS SEULEMENT SI IL APPARTIENT À ce groupe»?
Robo Robok
8

Tel que déjà publié

Il vous suffit de donner la propriété des dossiers à Apache:

mais j'ai ajouté -R pour la commande chown : sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage

Stanislav Potapenko
la source
3
Pourquoi devons-nous donner la permission au répertoire des fournisseurs? Le stockage a du sens, pour écrire dans des fichiers journaux, etc. Mais le vendeur? Pourquoi?
Ali Haris
Comme écrit ci-dessus dans certains commentaires: "Cependant, votre ordinateur et votre serveur Apache doivent pouvoir écrire dans ces dossiers. Ex: lorsque vous exécutez des commandes comme php artisan, votre ordinateur doit écrire dans le fichier journal en stockage."
Stanislav Potapenko
Erreur sur mac: chown: www-data: nom de groupe illégal
Sunil Kumar
Veuillez consulter stackoverflow.com/questions/8035939/…
Stanislav Potapenko
7

La plupart des dossiers doivent être "755" normaux et les fichiers "644"

Laravel nécessite que certains dossiers soient accessibles en écriture pour l'utilisateur du serveur Web. Vous pouvez utiliser cette commande sur les systèmes d'exploitation basés sur Unix.

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
Siddharth Joshi
la source
7

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

Davron Achilov
la source
2
Ceci est une mauvaise réponse. Vous ne devriez jamais avoir besoin d'utiliser 777 pour n'importe quel dossier si vous avez correctement configuré le serveur Web. L'utilisation de 777 ouvre votre serveur à tout pirate pour télécharger un fichier et exécuter ledit fichier s'il sait où se trouve le dossier.
mbozwood
2
D'accord. Qu'est-ce que tu offres?
Davron Achilov
Et si oui, sera-ce vrai? chown -R $ USER: stockage www-data, chown -R $ USER: www-data bootstrap / cache
Davron Achilov
Voir la bonne réponse, elle contient toutes les informations nécessaires que vous pouvez absolument mettre dans la post-mise à jour :)
mbozwood
6

Les documents de Laravel 5.4 disent:

Après avoir installé Laravel, vous devrez peut-être configurer certaines autorisations. Les répertoires dans storageet les bootstrap/cacherépertoires doivent être accessibles en écriture par votre serveur Web, sinon Laravel ne fonctionnera pas. Si vous utilisez la machine virtuelle Homestead, ces autorisations doivent déjà être définies.

Il y a beaucoup de réponses sur cette page qui mentionnent l'utilisation d' 777autorisations. Ne fais pas ça. Tu t'exposerais exposeriez à des pirates.

Au lieu de cela, suivez les suggestions des autres sur la façon de définir des autorisations de 755 (ou plus restrictives). Vous devrez peut-être déterminer quel utilisateur votre application exécute en exécutant whoamidans le terminal, puis changer la propriété de certains répertoires à l'aide chown -R.

Si vous n'êtes pas autorisé à utiliser sudo comme tant d'autres réponses l'exigent ...

Votre serveur est probablement un hôte partagé tel que Cloudways.

(Dans mon cas, j'avais cloné mon application Laravel dans un deuxième serveur Cloudways, et cela ne fonctionnait pas complètement parce que les autorisations du storageetbootstrap/cache répertoires ont été gâchées.)

J'avais besoin d'utiliser:

Cloudways Platform > Server > Application Settings > Reset Permission

Ensuite, je pouvais courir php artisan cache:cleardans le terminal.

Ryan
la source
4

La solution publiée par bgles est parfaite pour moi en termes de définition correcte des autorisations au départ (j'utilise la deuxième méthode), mais elle a toujours des problèmes potentiels pour Laravel.

Par défaut, Apache créera des fichiers avec 644 autorisations. C'est donc à peu près tout dans le stockage /. Donc, si vous supprimez le contenu de stockage / framework / vues, puis accédez à une page via Apache, vous constaterez que la vue en cache a été créée comme:

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

Si vous exécutez "artisan serve" et accédez à une autre page, vous obtiendrez différentes autorisations car CLI PHP se comporte différemment d'Apache:

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

En soi, ce n'est pas grave car vous ne ferez rien de tout cela en production. Mais si Apache crée un fichier qui doit ensuite être écrit par l'utilisateur, il échouera. Et cela peut s'appliquer aux fichiers de cache, aux vues mises en cache et aux journaux lors du déploiement à l'aide d'un utilisateur connecté et d'un artisan. Un exemple facile étant "artisan cache: clear" qui ne supprimera pas les fichiers de cache qui sont www-data: www-data 644.

Cela peut être partiellement atténué en exécutant des commandes artisanales en tant que www-data, donc vous ferez / scripterez tout comme:

sudo -u www-data php artisan cache:clear

Ou vous éviterez la fastidieuse de ceci et l'ajouterez à vos .bash_aliases:

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

C'est assez bon et n'affecte en rien la sécurité. Mais sur les machines de développement, l'exécution de scripts de test et d'assainissement rend cela difficile, à moins que vous ne vouliez configurer des alias pour utiliser 'sudo -u www-data' pour exécuter phpunit et tout ce que vous vérifiez avec vos builds qui pourrait entraîner la création de fichiers.

La solution consiste à suivre la deuxième partie des conseils bgles, à ajouter ce qui suit à / etc / apache2 / envvars et à redémarrer (pas recharger) Apache:

umask 002

Cela forcera Apache à créer des fichiers comme 664 par défaut. En soi, cela peut présenter un risque pour la sécurité. Cependant, sur les environnements Laravel principalement discutés ici (Homestead, Vagrant, Ubuntu), le serveur Web fonctionne en tant qu'utilisateur www-data sous le groupe www-data. Donc, si vous n'autorisez pas arbitrairement les utilisateurs à rejoindre le groupe www-data, il ne devrait pas y avoir de risque supplémentaire. Si quelqu'un réussit à sortir du serveur Web, il a de toute façon un niveau d'accès aux données www, donc rien n'est perdu (bien que ce ne soit pas la meilleure attitude à avoir en matière de sécurité). Donc, en production, c'est relativement sûr et sur une machine de développement mono-utilisateur, ce n'est tout simplement pas un problème.

En fin de compte, comme votre utilisateur est dans le groupe www-data, et tous les répertoires contenant ces fichiers sont g + s (le fichier est toujours créé sous le groupe du répertoire parent), tout ce qui est créé par l'utilisateur ou par www-data sera r / w pour l'autre.

Et c'est le but ici.

Éditer

En étudiant plus en détail l'approche ci-dessus pour définir des autorisations, cela semble toujours assez bon, mais quelques ajustements peuvent aider:

Par défaut, les répertoires sont 775 et les fichiers sont 664 et tous les fichiers ont le propriétaire et le groupe de l'utilisateur qui vient d'installer le framework. Supposons donc que nous partons de ce point.

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

La première chose que nous faisons est de bloquer l'accès à tout le monde et de faire du groupe des www-data. Seuls le propriétaire et les membres de www-data peuvent accéder à l'annuaire.

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

Pour permettre au serveur Web de créer services.json et compiled.php, comme suggéré par le guide d'installation officiel de Laravel. La définition du bit collant de groupe signifie que ceux-ci appartiendront au créateur avec un groupe de www-data.

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

Nous faisons la même chose avec le dossier de stockage pour permettre la création de fichiers cache, log, session et view. Nous utilisons find pour définir explicitement les autorisations de répertoire différemment pour les répertoires et les fichiers. Nous n'avions pas besoin de le faire dans bootstrap / cache car il n'y a (normalement) aucun sous-répertoire dedans.

Vous devrez peut-être réappliquer tous les indicateurs exécutables, supprimer le fournisseur / * et réinstaller les dépendances de compositeur pour recréer des liens pour phpunit et al, par exemple:

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

C'est tout. À l'exception du umask pour Apache expliqué ci-dessus, c'est tout ce qui est nécessaire sans rendre la totalité de la racine du projet accessible en écriture par www-data, ce qui se produit avec d'autres solutions. Il est donc légèrement plus sûr de cette façon, car un intrus fonctionnant en tant que www-data a un accès en écriture plus limité.

terminer l'édition

Changements pour Systemd

Cela s'applique à l'utilisation de php-fpm, mais peut-être à d'autres aussi.

Le service systemd standard doit être remplacé, le umask défini dans le fichier override.conf et le service redémarré:

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

Cela a fonctionné pour moi:

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/

Ce qu'il fait:

  • Remplacez toutes les autorisations de fichier par 644
  • Remplacez toutes les autorisations de dossier par 755
  • Pour le stockage et le cache d'amorçage (dossiers spéciaux utilisés par laravel pour créer et exécuter des fichiers, non disponibles de l'extérieur), définissez l'autorisation sur 777 pour tout ce qui se trouve à l'intérieur

Remarque: Peut-être que vous ne pouvez pas ou n'avez pas besoin de le faire avec le préfixe sudo. cela dépend des permissions de votre utilisateur, du groupe, etc ...

Luca C.
la source
2

J'ai décidé d'écrire mon propre script pour alléger la douleur de la mise en place de projets.

Exécutez ce qui suit dans la racine de votre projet:

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

Attendez que le démarrage soit terminé et vous êtes prêt à partir.

Passez en revue le script avant utilisation.

Jonathan
la source
2

J'ai installé laravel sur l'instance EC2 et j'ai passé 3 jours pour corriger l'erreur d'autorisation et enfin la corriger. Je veux donc partager cette expérience avec quelqu'un d'autre.

  1. problème d'utilisateur Lorsque je me suis connecté à l'instance ec2, mon nom d'utilisateur est ec2-user et usergroup est ec2-user. Et le site Web fonctionne sous l'utilisateur httpd: apache: apache, nous devons donc définir l'autorisation pour apache.

  2. autorisation de dossier et de fichier A. structure de dossier d'abord, vous devez vous assurer que vous avez une telle structure de dossier comme celle-ci sous le stockage

    espace de rangement

    • cadre
      • cache
      • séances
      • vues
    • logs La structure des dossiers peut être différente selon la version de laravel que vous utilisez. ma version laravel est 5.2 et vous pouvez trouver la structure appropriée en fonction de votre version.

B. autorisation Dans un premier temps, je vois les instructions pour définir 777 sous stockage pour supprimer file_put_contents: échec d'ouverture du flux d'erreur. J'ai donc configuré l'autorisation 777 pour stocker le stockage chmod -R 777 Mais l'erreur n'a pas été corrigée. ici, vous devriez en considérer un: qui écrit les fichiers dans le stockage / les sessions et les vues. Ce n'est pas ec2-user, mais apache. Oui bien. L'utilisateur "apache" écrit le fichier (fichier de session, fichier de vue compilée) dans le dossier de session et de vue. Vous devez donc donner à apache l'autorisation d'écrire sur ces dossiers. Par défaut: SELinux dit que le dossier / var / www doit être en lecture seule par le démon apache.

Donc, pour cela, nous pouvons définir le selinux sur 0: setenforce 0

Cela peut résoudre le problème temporellement, mais cela fait que mysql ne fonctionne pas. donc ce n'est pas une si bonne solution.

Vous pouvez définir un contexte de lecture-écriture dans le dossier de stockage avec: (n'oubliez pas de mettre en vigueur 1 pour le tester)

chcon -Rt httpd_sys_content_rw_t storage/

Ensuite, votre problème sera résolu.

  1. et n'oubliez pas cette mise à jour du cache php artisan du compositeur: effacer

    Ces commandes seront utiles après ou avant.

    J'espère que vous économisez votre temps. Bonne chance. Hacken

Hacken Lee
la source
Avez-vous essayé d'appeler un script de ligne de commande à partir du serveur Web? J'ai un problème car il n'imprime aucune sortie
Volatil3
0

J'avais la configuration suivante:

  • NGINX (utilisateur exécutant: nginx)
  • PHP-FPM

Et appliqué les autorisations correctement comme @bgies l'a suggéré dans la réponse acceptée. Le problème dans mon cas était l'utilisateur et le groupe configurés en cours d'exécution de php-fpm qui était à l'origine apache.

Si vous utilisez NGINX avec php-fpm, vous devez ouvrir le fichier de configuration de php-fpm:

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

Et remplacer useret groupla valeur des options par un NGINX est configuré pour fonctionner avec; dans mon cas, les deux étaient 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 ...

Enregistrez-le et redémarrez les services nginx et php-fpm.

Amirreza Nasiri
la source
0

Pour les développeurs Laravel, les problèmes de répertoire peuvent être un peu pénibles. Dans mon application, je créais des répertoires à la volée et déplaçais des fichiers vers ce répertoire dans mon environnement local avec succès. Ensuite, sur le serveur, je recevais des erreurs lors du déplacement des fichiers vers le répertoire nouvellement créé.

Voici les choses que j'ai faites et qui ont obtenu un résultat réussi à la fin.

  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. Lors de la création du nouveau répertoire à la volée, j'ai utilisé la commande mkdir($save_path, 0755, true);

Après avoir effectué ces modifications sur le serveur de production, j'ai réussi à créer de nouveaux répertoires et à y déplacer des fichiers.

Enfin, si vous utilisez File façade dans Laravel, vous pouvez faire quelque chose comme ceci: File::makeDirectory($save_path, 0755, true);

Mycodingproject
la source
-1

J'ai trouvé une solution encore meilleure à cela. Cela est dû au fait que php fonctionne en tant qu'autre utilisateur par défaut.

donc pour résoudre ce problème

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

puis modifiez le user = "put user that owns the directories" group = "put user that owns the directories"

puis:

sudo systemctl reload php7.0-fpm

cecil merrel aka bringrainfire
la source
Si le visiteur de la page Web parvient à sortir du serveur Web, il aura désormais les droits d'accès de "l'utilisateur propriétaire des répertoires". Si cet utilisateur est www-data, il y a un nombre limité de dommages qu'il peut faire, et c'est pourquoi apache fonctionne en tant qu'utilisateur limité. Si cet utilisateur n'est pas si limité, il peut faire plus de dégâts. Si cet utilisateur a des droits sudo, il peut faire beaucoup plus de dégâts.
markdwhite
C'est la même chose avec Apache. BTW je lance nignx comme un grand garçon maintenant
cecil merrel aka bringrainfire