PHP FPM donne une autorisation refusée?

9

J'ai lu plusieurs entrées sur les raisons pour lesquelles PHP-FPM pourrait me donner une autorisation refusée mais je ne peux pas le résoudre.

Les journaux d'erreurs se lisent comme suit:

    2013/04/20 23:33:28 [crit] 15479#0: *6 open() "/var/lib/nginx/tmp/fastcgi
/2/00/0000000002" failed (13: Permission denied) while reading upstream, client: 
99.999.999.999, server: example.net, request: "GET /wp-admin/ HTTP/1.1", 
upstream: "fastcgi://unix:/tmp/php-fpm.sock:", host: "example.net", referrer:    
"http://example.net/"

Je suis un peu mais perdu:

  1. J'ai mis le / var / lib / nginx / tmp à ec2-user (j'ai même +777 tout pour vérifier)
  2. J'ai défini le /tmp/php-fpm.sock sur ec2-user
  3. le fichier de conf nginx est défini sur ec2-user
  4. php-conf est défini sur user et group ec2-user
  5. ps aux donne à ec2-user sur tous les processus php-fpm et nginx

Ma configuration Nginx comprend beaucoup de fichiers, la conf de base est:

user              ec2-user ec2-user;
worker_processes  5;  
error_log /opt/nginx/error.log;    
pid        /var/run/nginx.pid;    
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /opt/nginx/access.log main;    
    sendfile        on;
    keepalive_timeout  65;
    client_max_body_size 13m;
    index index.php index.html index.htm;
    upstream php {
       server unix:/tmp/php-fpm.sock;
    }
    include /etc/nginx/conf.d/*.conf;
    include /mnt/web/nginx/conf.d/*.conf;
}

mon /etc/nginx/conf.d/ est vide mon /mnt/web/nginx/conf.d contient BEAUCOUP de configurations de site Web qui incluent toutes "wordpress.conf":

location / {
    try_files $uri $uri/ /index.php?$args;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 24h;
    log_not_found off;
}
location ~ \.php$ {
    try_files $uri =404;    
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php;
}

Mon /opt/php/etc/php-fpm.conf:

include=/opt/php/etc/fpm.d/*.conf
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = notice
[www]
listen = /tmp/php-fpm.sock
user = ec2-user
group = ec2-user
pm = dynamic
pm.max_children = 250
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
pm.status_path = /fpm-status
ping.path = /fpm-ping
slowlog = log/$pool.log.slow
catch_workers_output = yes

MISE À JOUR: a trouvé le problème, mettez-le dans la réponse

edelwater
la source
1
selinux est-il activé? exécuter getenforce ou cat / selinux / enforce si non 0 est activé
silviud
1
Quel est le reste de votre configuration nginx?
Michael Hampton
1
votre socket depuis le fichier journal est /tmp/php-fpm.sock mais vous avez changé / var / lib / nginx / tmp - avez-vous fait un chroot dans nginx?
silviud
1
envoyer la sortie de la commande mount
silviud
1
regardez aussi que tous les répertoires de votre maison ... voir serverfault.com/questions/170192/…
silviud

Réponses:

16

J'avais réglé le / var / lib / nginx / tmp sur ec2-user / ec2-user (j'ai même +777 tout pour vérifier)

Mais ... j'ai aussi dû définir / var / lib / nginx sur ec2-user / ec2-user

... après avoir également affiché / chgrp le dossier parent nginx: plus d'erreurs.

Ça m'a pris quelques heures ...

edelwater
la source
7
chown -Rf www-data:www-data /var/lib/nginxtravaillé pour moi. n'avait pas besoin de chmod quoi que ce soit.
Chris
la vérification des fichiers journaux aide toujours, n'oubliez pas de les vérifier avant tout :)
tristesse de la poésie
9

Cela se produit généralement. Lorsque le userparamètre dans nginx.conf passe de

user nginx;

à autre chose. Dans ce cas,

user ec2-user ec2-user;

La commande chmod n'est pas nécessaire selon le commentaire de Chris et pourrait ouvrir un trou de sécurité.

Solution:

Vérifiez la propriété actuelle de l'utilisateur et du groupe sur / var / lib / nginx.

$ ls -ld /var/lib/nginx
drwx------ 3 nginx nginx 4096 Aug  5 00:05 /var/lib/nginx

Cela vous indique qu'un utilisateur et un groupe éventuellement inexistants nommés sont nginxpropriétaires de ce dossier. Cela empêche le téléchargement de fichiers.

Modifiez la propriété du dossier à l'utilisateur défini dans nginx.conf dans ce cas ec2-user(sudo peut ne pas être requis).

$ sudo chown -Rf ec2-user:ec2-user /var/lib/nginx

Vérifiez qu'il a réellement changé.

$ ls -ld /var/lib/nginx
drwx------ 3 ec2-user ec2-user 4096 Aug  5 00:05 /var/lib/nginx

L'erreur d'autorisation refusée devrait maintenant disparaître. Vérifiez le fichier error.log (basé sur l'emplacement nginx.conf error_log).

$ sudo nano /opt/nginx/error.log

Si cela ne fonctionne pas, vous devrez peut-être recharger nginx et php-fpm.

$ sudo service nginx reload
$ sudo service php-fpm reload
nu everest
la source
Cela a fait l'affaire sur mon serveur Google Cloud Centos 7.
Damodar Bashyal
3

Aucune des autres solutions n'a fonctionné pour moi, mais j'ai trouvé que cela fonctionnait:

$ apt-get install php-pear php5-dev
$ pecl install timezonedb
$ echo 'extension=timezonedb.so'> /etc/php5/mods-available/timezonedb.ini
$ ln -sf /etc/php5/mods-available/timezonedb.ini /etc/php5/conf.d/30-timezonedb.ini
$ service php5-fpm restart

La source

nullvariable
la source
Ok, nous avons essayé plusieurs solutions et c'est celle qui a fonctionné. Nous ne savons pas pourquoi cela a fonctionné ni quel était le problème, mais cela a fonctionné.
Neil Masters
1

J'ai le même problème avec le téléchargement de fichiers. erreur nginx 500 2015/07/05 03:50:36 [crit] 3656#0: *7 open() "/var/lib/nginx/tmp/client_body/0000000007" failed (13: Permission denied), client: 10.0.2.2, server: www.test.com, request: "POST /api/v1/users HTTP/1.1", host: "test"

Le problème était lié à l'autorisation uniquement, je viens de régler chmod -R 755 /var/lib/nginxet les choses ont fonctionné!

Bishwanath Jha
la source
0

Je viens de résoudre mon problème avec les autorisations. Le moyen le plus simple et le plus simple était de ne pas exécuter php-fpm ou nginx en tant que sudo (super utilisateur). Ce que vous auriez à faire, c'est:

  1. afficher tous les emplacements de sortie du journal pour nginx dans yourUserName: exemple yourUserName :chown yourUserName:yourUserName /var/log/nginx/error.log
  2. Serveur de mise à jour suivant dir ainsi par exemple :chown yourUserName:yourUserName -R /var/www

En n'utilisant pas root, je n'ai pas eu à changer d'utilisateur ou de groupe php-fpm ou tout utilisateur ou groupe d'écoute. Assurez-vous également de commenter nginx.conf 'user' car ce sera le nom de l'utilisateur actuel.

clh
la source
Veuillez ne pas poster la même réponse plusieurs fois. De plus, ce problème est depuis longtemps résolu.
Sven
0

Au lieu de modifier les autorisations sur / var / lib / nginx / peu importe, ne serait-il pas plus logique de simplement dire à nginx d'utiliser un chemin différent comme / tmp / nginx? Cela a résolu le problème pour moi:

# create the directory
mkdir /tmp/nginx
chown -R nginx.nginx /tmp/nginx (assumes nginx user is named nginx)
chmod -R 700 /tmp/nginx

Les autorisations / tmp / nginx doivent être de préférence 700 (ce qui ne devrait pas être un problème tant que le propriétaire est le même utilisateur spécifié dans la directive «utilisateur» /etc/nginx/nginx.conf) ou 770 si, pour une raison quelconque, vous devez avoir un propriétaire de fichier et un nginx différents pour effectuer des E / S via des autorisations de groupe. Je n'ai jamais vu ça mais qui sait.

Sur centos7, modifiez /etc/nginx/nginx.conf pour indiquer à nginx d'utiliser ce nouveau répertoire pour les corps des clients

...

http {
  ...
  client_body_temp_path /tmp/nginx 1 2;
  ...
}

et redémarrez nginx (à nouveau centos7)

systemctl restart nginx
siliconrockstar
la source
Ne jamais rien chmod 777. Surtout pas la cache! Désormais, tout utilisateur local peut réécrire votre cache et envoyer des données potentiellement malveillantes à vos utilisateurs. Pour les téléchargements, quelqu'un pourrait remplacer son propre téléchargement à la place.
Michael Hampton
Jesus mec relax, cette version fait partie d'un cluster de démonstration. Mais bonne prise pour les gens qui ne connaissent peut-être pas mieux, je vais éditer la réponse.
siliconrockstar