Quelles autorisations / propriété définir sur le dossier des sessions PHP lors de l'exécution de FastCGI / PHP-FPM (en tant qu'utilisateur «personne»)?

17

J'ai du mal à exécuter un certain nombre de scripts car PHP-FPM ne peut pas écrire dans mon dossier de session:

"2009/10/01 23:54:07 [erreur] 17830 # 0: * 24 FastCGI envoyé dans stderr:" Avertissement PHP:
    Inconnu: ouvert (/ var / lib / php / session / sess_cskfq4godj4ka2a637i5lq41o5, O_RDWR)
    a échoué: autorisation refusée (13) dans Inconnu sur la ligne 0
Avertissement PHP: inconnu: impossible d'écrire les données de session (fichiers). Veuillez vérifier
    que le paramètre actuel de session.save_path est correct
    (/ var / lib / php / session) dans Inconnu sur la ligne 0 "lors de la lecture en amont"

Évidemment, c'est un problème de permission; Le propriétaire / groupe de mon dossier de session est l'utilisateur du serveur Web, NGINX. PHP-FPM fonctionne comme nobodysi, et donc l'ajouter au groupe nginx n'est pas si simple.

Une solution temporaire consiste à définir les autorisations d' /var/lib/php/sessionà 777- j'ai un sentiment qui n'est pas la « meilleure pratique » bien.

Quelle est la meilleure pratique lorsque vous devez attribuer un accès en écriture à un démon dans un dossier, mais qu'il s'exécute en tant que nobody?

Professeur Frink
la source

Réponses:

24

Les autorisations correctes pour nous où

chown -R nobody:nogroup /var/lib/php/session

as php-cgiruns as nobody, même si NGinx s'exécute en tant qu'utilisateurnginx

Judder
la source
Dans mon cas, ce n'était pas une question de propriété / autorisations. Retirez le "3;" from session.save_path = "3; / var / lib / php / sessions"
John Doe
1
J'obtiens l'erreur suivante: Groupe invalide << personne: nogroupe >> :(
Pathros
j'ai pu voir quel est mon nobodyutilisateur qui exécute php avec cette ligne de code: <?php echo exec('whoami'); ?>(dans mon cas www-data) et après cela a été simple comme je viens de l'écrire, chown -R www-data:www-data /var/lib/php/sessionsc'est un résultat google sous-estimé car c'était la seule réponse qui a aidé moi après des heures de recherche! Merci!
Dimitar
9

Si vous utilisez nginx, vous pourriez rencontrer cela lors de l'exécution d'une mise à jour du système.

Parfois, lorsque vous mettez à jour le système, le groupe de /var/lib/php/sessiondevient Apache.

Essayez d'exécuter sudo chgrp nginx /var/lib/php/*au lieu de définir des autorisations sur 777, ce qui est une mauvaise pratique.

Cela a fonctionné pour moi au moins.

Nick G
la source
1
Cela devrait être marqué comme réponse acceptée.
Yuda Prawira
3

Utilisez la directive /etc/php.ini session.save_path .

Une solution temporaire consiste à définir les autorisations de / var / lib / php / session sur 777 - j'ai le sentiment que ce n'est pas la "meilleure pratique".

"Si vous laissez cet ensemble dans un répertoire lisible par le monde, les autres utilisateurs du serveur peuvent détourner des sessions en obtenant la liste des fichiers dans ce répertoire."

SaveTheRbtz
la source
Désolé, je pense que je n'ai peut-être pas été clair: session.save_path est déjà défini sur / var / lib / php / session. Le problème est que je ne peux pas déterminer les autorisations et la propriété à affecter au répertoire du chemin de session afin de permettre à PHP-FPM d'écrire dessus, ainsi que de le garder en sécurité. Avoir le répertoire défini comme propriétaire / groupe "nginx" (le serveur Web que j'utilise) et les autorisations 755 ne semblent pas faire l'affaire
professeur Frink
4
1. Utilisez le même utilisateur: groupe pour nginx et php-fpm (via l'un nginx.confou l' autre php-fpm.conf), afin que vous puissiez conserver ce répertoire 700. 2. Utilisez chown -R nginx:nobody /var/lib/php/session && chmod -R 770 /var/lib/php/sessiondonc je pense que nginx et php-fpm peuvent l'utiliser
SaveTheRbtz
2
Je peux confirmer que l'utilisation de nginx: nobody (ou nginx: nogroup dans certaines circonstances) fonctionne. Si c'est possible, je pencherais pour l'option 1 de SaveTheRbtz.
Michael Johnson
3

J'ai dû créer un dossier avec 0700 droits dans / var / lib / php / session pour chaque pool php-fpm.

Le propriétaire de ce dossier est l'utilisateur et le groupe du pool php-fpm.

Et / var / lib / php / session maintenant 0777.

Je pense que cette méthode est la plus sûre. Seul l'utilisateur du pool php-fpm verra ces sessions.

Alexander Merkulov
la source
1

J'ai eu le même problème et je l'ai résolu. Je suis allé /tmp(c'est là que se trouvent mes fichiers ses_ *) et je les ai tous supprimés. Après cela, tout allait bien.

Aussi près que possible, le système essayait d'écrire sur d'anciens fichiers verrouillés.

Le problème est survenu après avoir joué avec php.ini. J'ai perdu quelques années de ma vie mais j'ai finalement trouvé la solution.

Christos
la source
1

La bonne façon devrait être de changer la propriété du dossier de session en nginx. Cependant, PHP-FPM ne s'exécute pas en utilisant l'utilisateur nginx par défaut. Il utilise apache par défaut.

Cela dit, vous devez modifier l'utilisateur utilisé par PHP-FPM en le modifiant /etc/php-fpm.d/www.conf.

; 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

Redémarrez PHP-FPM et vous devriez être prêt à partir.

service php-fpm restart


L'emplacement du chemin de session PHP se trouve /etc/php.inisous session.save_path. /var/lib/php/sessionest la valeur par défaut.

Commande pour mettre à jour la propriété et le groupe du dossier de session php

chown -R nginx:nginx /var/lib/php/session

Et vous devriez être bon pour aller même avec chmod de 700.

josephting
la source
1

Le répertoire / var / lib / php / sessions doit avoir des autorisations de bit collant.

sudo chmod 1773 /var/lib/php/sessions

ls -al /var/lib/php/
drwxr-xr-x  4 root root   .
drwxr-xr-x 51 root root   ..
drwxr-xr-x  3 root root   modules
drwx-wx-wt  2 root root   sessions
Łukasz
la source
0

Sur la base de la réponse de @Judder , pour le faire fonctionner, j'ai dû ajouter la commande suivante pour donner des autorisations de lecture et d' écriture à personne et à aucun groupe :

chown -R nobody:nogroup /var/lib/php/session

sudo chmod -R ug+rw /var/lib/php/sessions

chmod changera les autorisations sur le dossier donné
-R appliquera les mêmes autorisations aux dossiers et fichiers créés dans le dossier donné
u pour l'utilisateur
g pour le groupe
r pour l'autorisation de lecture
w pour l'autorisation d'écriture

Guillaume Genreau
la source