web-dev-qa-db-fra.com

Accès refusé (403) pour PHP des fichiers avec Nginx + PHP-FPM

Je passe quelques heures sur ce sujet et, malgré le nombre élevé de postes qui y sont liés, je ne peux pas le résoudre. J'ai une boîte Fedora 20 avec Nginx + PHP-FPM qui fonctionnait assez bien jusqu'à aujourd'hui (après avoir rechargé php-fpm.service, je suppose). Nginx sert des fichiers statiques sans problème, mais tout fichier PHP déclenche une erreur 403.

Les autorisations sont ok, nginx et php-fpm fonctionnent sous l'utilisateur "nginx":

root     13763  0.0  0.6 490428 24924 ?        Ss   15:47   0:00 php-fpm: master process (/etc/php-fpm.conf)
nginx    13764  0.0  0.1 490428  7296 ?        S    15:47   0:00 php-fpm: pool www
nginx    13765  0.0  0.1 490428  7296 ?        S    15:47   0:00 php-fpm: pool www
nginx    13766  0.0  0.1 490428  7296 ?        S    15:47   0:00 php-fpm: pool www
nginx    13767  0.0  0.1 490428  7296 ?        S    15:47   0:00 php-fpm: pool www
nginx    13768  0.0  0.1 490428  6848 ?        S    15:47   0:00 php-fpm: pool www

Les fichiers servis ont également été définis sur nginx user. J'ai même mis fin à la modification de ces fichiers à essayer, mais je n'ai toujours "Accès refusé" pour aucun fichier PHP.

Ci-dessous, un serveur de ma configuration Nginx:

server {
        listen          80;
        server_name     localhost;

        root            /var/www/html;

         location ~ \.php$ {
            fastcgi_intercept_errors on;
            try_files $uri =404;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
}

Le pool PHP-FPM:

[www]
...
listen = 127.0.0.1:9000
user = nginx
group = nginx
...

Pour les versions:

php-5.5.11 (ainsi que php-fpm-5.5.11 bien sûr)

nginx-1.4.7

J'ajoute le journal des erreurs Nginx:

 FastCGI sent in stderr: "Access to the script '/var/www/html' has been denied (see security.limit_extensions)" while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", Host: "xxx.xxx.xxx.xxx"

Et précisez que security.limit_extensions est correct, définissez-le sur: security.limit_extensions = .php.

À propos des autorisations de chemin,/var/www/html peut être parcouru . Que me manque-t-il?

19
feub

Voici quelques solutions possibles:

  1. Dans votre www.conf php-fpm, définissez security.limit_extensions sur .php ou .php5 ou selon ce qui convient à votre environnement. Pour certains utilisateurs, supprimer complètement toutes les valeurs ou le définir sur FALSE était le seul moyen de le faire fonctionner. 

  2. Dans votre fichier de configuration nginx, définissez fastcgi_pass sur votre adresse de socket (par exemple, unix:/var/run/php-fpm/php-fpm.sock;) au lieu de votre adresse de serveur et de votre port.

  3. Vérifiez votre paramètre SCRIPT_FILENAME fastcgi et réglez-le en fonction de l'emplacement de vos fichiers.

  4. Dans votre fichier de configuration nginx, incluez fastcgi_split_path_info ^(.+\.php)(/.+)$; dans le bloc d’emplacement où sont définis tous les autres paramètres de fastcgi.

  5. Dans votre php.ini, définissez cgi.fix_pathinfo sur 1

37
VF_

Veuillez noter que la solution ci-dessus (régler cgi.fix_pathinfo sur 1) est une idée de terrible. Voir https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/ pour un bon aperçu.

Le problème vient probablement de votre application qui s'appuie sur PATH_INFO. Activez la journalisation des accès pour php pour obtenir plus d'informations sur la façon dont votre application est appelée pour vous aider à résoudre ce problème.

Encore une fois, pour être sûr, la solution acceptée est une idée terrible, et votre site sera probablement piraté.

8
mdekkers

N'oubliez pas de redémarrer le service php5-fpm après avoir changé le fichier php.ini !!

service php5-fpm redémarrer ou service php5-fpm reload

fpm commence par php5, il ne suffit donc pas de redémarrer nginx pour appliquer les modifications.

2
Eduard Pertíñez

Cela pourrait également se produire s'il n'y a pas de index.php dans la racine de votre document vhost. 

Vérifiez soigneusement le paramètre www_root dans votre configuration nginx. Ensuite, vérifiez que le fichier php que vous essayez de frapper est bien dedans.

Dans mon cas, j'ai mal saisi le chemin racine de la documentation vhost et je l'ai ainsi dirigé vers un répertoire vide, ce qui a donné 403.

0
joe_flash

Pour la référence de ceux qui viendront plus tard: Dans la conf de votre site, essayez d'ajouter: Fastcgi_param PATH_INFO $ fastcgi_path_info; Regardez également ce que fait SELinux. Pour le désactiver: setenforce 0 Mais ensuite, déterminez quel script est le problème et remettez-le à setenforce 1

0
Cong IT

Cela peut être lié à selinux . Si vous utilisez le dossier shared of Virtual Box , vous ne pouvez pas modifier les autorisations d'accès dans ce dossier sous Linux. Par conséquent, vous pouvez le résoudre après la fermeture de selinux .

0
筱枫泠