web-dev-qa-db-fra.com

Centos 7 / Apache / PHP - mkdir (): autorisation refusée

Avant de crier DUPLICATE! et bannissez-moi dans l'abîme, écoutez-moi. :)

J'ai développé un site intranet pour l'entreprise avec laquelle je travaille, et à l'origine je le développais directement depuis mon poste de travail exécutant Windows 7/IIS. Comme j'ai presque terminé le site/les applications, on m'a donné une boîte Centos 7 qui s'exécute Apache, j'ai donc commencé le processus de migration vers celle-ci système. J'ai résolu la plupart des problèmes mineurs et ai fait fonctionner le site maintenant. Cependant, une partie du site interagit avec notre base de données et crée un répertoire/fichier journal basé sur la personne connectée. Cette partie utilise la fonction mkdir (), mais j'obtiens des problèmes d'autorisation avec.

mkdir(): Permission denied

Voici ce que j'ai déjà fait:

  • Puisque j'utilise Centos 7, l'utilisateur/groupe Apache est Apache: apache. J'ai utilisé chown et changé le propriétaire de/var/www/html/et le dossier Logs en utilisateur/groupe Apache. Pour être sûr, j'ai revérifié le httpd.conf et également vérifié les processus en cours d'exécution pour m'assurer que j'avais le bon utilisateur/groupe.
  • J'ai essayé, juste à des fins de test, de changer les autorisations de tous ces dossiers en chmod 777, mais j'obtiens la même erreur.
  • Vous avez recherché StackOverflow de haut en bas, et vous obtenez uniquement des réponses pour des choses que j'ai déjà essayées, mais en vain.

Donc, que j'utilise chmod ou chown pour modifier les autorisations pour les dossiers auxquels on accède, j'obtiens le même type d'erreur. Pour être sûr, j'ai vérifié l'utilisateur PHP également, et il utilise également l'utilisateur Apache.

Si quelqu'un peut avoir des informations supplémentaires sur les raisons pour lesquelles cela ne fonctionne pas, même avec les autorisations modifiées, veuillez m'éclairer. S'il m'arrivait de manquer le seul article qui expliquait cette situation particulière, alors criez en double et bannissez-moi dans l'abîme. lol :)


EDIT D'accord, donc lors de tests supplémentaires, j'ai découvert 2 problèmes qui semblent être à l'origine de ce problème global.

  1. PHP essaie de définir des autorisations pour le dossier lorsqu'il est créé à partir du script, et il semble que le serveur n'aime pas cela même si Apache est le propriétaire. En supprimant cette partie du code, l'erreur d'autorisations disparaît et j'obtiens une erreur avec "aucun fichier ou répertoire".
  2. Lors du test de création de répertoires avec l'utilisateur Apache via Sudo, il a pu créer un répertoire sans problème. Cependant, mon script PHP crée 2 répertoires, puis un fichier journal dans le dernier créé. Il semble que vous ne pouvez pas créer deux répertoires en même temps ?? Par exemple, il est un dossier Logs déjà créé, et PHP essaie de créer deux répertoires sous celui-ci, un pour l'ID de l'utilisateur et puis un autre dossier à l'intérieur de celui-ci avec la date. Donc une fois le PHP s'exécute, il devrait créer quelque chose comme "Logs/5235/3-3-2015 /"

Juste pour noter, j'ai essayé de définir la valeur récursive sur true sur mkdir en PHP, mais c'est à ce moment-là que je reçois les problèmes d'autorisation initialement notés. Lorsque le mode récursif/est supprimé, il n'obtient pas le problème d'autorisation, mais il n'est pas en mesure de créer des répertoires imbriqués.


EDIT2

Pour tester mes théories, j'ai supprimé l'imbrication et essayé de faire en sorte que mkdir crée un seul répertoire, et cela génère les mêmes erreurs qu'auparavant. Bien qu'il soit la propriété d'Apache, et même si je le mets à 777, il repousse les problèmes d'autorisation.

16
Fata1Err0r

Il se peut que bien que vous ayez les autorisations 755/777, SELinux empêche httpd d'écrire/créer des répertoires.

Essayer:

chcon -R -t httpd_sys_content_t /path/to/www
chcon -R -t httpd_sys_content_rw_t /path/to/www/dir/for/rw

Plus d'informations: http://wiki.centos.org/TipsAndTricks/SelinuxBooleans

41
drack

Je ne sais pas, mais les binaires PHP de votre Centos peuvent avoir des autorisations de fichiers cassées. Il y a deux façons de résoudre ce problème.

  • Compiler PHP à partir de zéro. Je préférerais cela car tout le contrôle sera le vôtre.
  • Ou Changer votre script php pour utiliser la fonction Umask () de PHP. Lien de documentation
2
risyasin