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?
Voici quelques solutions possibles:
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.
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.
Vérifiez votre paramètre SCRIPT_FILENAME
fastcgi et réglez-le en fonction de l'emplacement de vos fichiers.
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.
Dans votre php.ini, définissez cgi.fix_pathinfo
sur 1
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é.
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.
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.
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
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 .