J'ai installé un serveur de test à l'aide de nginx
+ php-fpm
. J'ai essayé tout ce qui suit:
Nginx + Php5-fpm ne rend pas les fichiers php
nginx + php fpm -> 404 pages php - fichier introuvable
Lors de l'accès à PHP, nginx génère une erreur 404
Résumant ce que j'ai essayé:
0777
).fastcgi_intercept_errors on
.root
aux niveaux: server
, location
et location ~ \.php
.fastcgi_param SCRIPT_FILENAME
directive.Le serveur renvoie 404 sur (et uniquement sur) .php
scripts. Je peux les renommer en .html
et ils iraient bien. Comment puis-je m'y prendre?
C'est mon nginx.conf
:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 2;
include /etc/nginx/conf.d/*.conf;
index index.html index.htm;
server {
listen 80;
server_name _;
root /var/www/html;
location / {
root /var/www/html;
index index.php index.html index.htm;
}
error_page 404 /404.html;
location = /40x.html {
#root /var/www/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
#root /var/www/html;
}
location ~ \.php$ {
root /var/www/html;
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
Résolu. Il s'avère que le problème était les autorisations définies sur le socket où php écoutait. Je viens de changer une directive appelée listen.mode
sur /etc/php-fpm.d/www.conf
listen.mode = 0750
Et définissez l'utilisateur sur nginx
:
listen.owner = nginx
listen.group = nginx
Le fichier ressemble donc à ceci:
srwxr-x---. 1 nginx nginx 0 jul 8 08:59 /var/run/php5-fpm.sock
Parce que j'utilisais un socket Unix au lieu d'un port TCP:
listen = /var/run/php5-fpm.sock;
De plus, je devenais 404
au lieu de 500
ou 503
parce que mon www.conf
a été configuré pour rediriger les erreurs vers pages personnalisées, et comme elles n'étaient pas là, je recevais 404
.
Éditer:
Il semble que dans les versions les plus récentes de la distribution nginx dans Fedora (Fedora 22, 23), nginx utilise l'utilisateur Apache par défaut, et le socket est également défini sur l'utilisateur Apache, donc aucune configuration supplémentaire n'est nécessaire.
J'ai effectivement reçu une erreur "Introuvable" car un livre que j'ai lu m'a donné une chaîne de correspondance incorrecte pour le chemin /php_status
que j'avais configuré dans php-fpm 7.0.x (actuellement 7.0.19) et dans nginx 1.12 (actuellement 1.12.0)
Voici la /etc/php/7.0/fpm/pool.d/{config}
pm.status_path = /php_status
Voici la configuration de default
dans /etc/nginx/sites-available
(Je suis sur Ubuntu)
server {
listen 80 default;
root /var/www;
index index.html index.htm default.html;
access_log /dev/null;
error_log /dev/null;
location / {
try_files $uri $uri/ =404;
}
location /php_status {
fastcgi_pass unix:/var/run/php7.0-fpm.sock;
# fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
allow 127.0.0.1;
deny all;
}
}
Remarque: Ce qui suit est conçu pour que
/php_status
n'est pas accessible au public sur Internet (ni PHP servi ou configuré pour l'hôte par défaut). Il comprend égalementfastcgi_pass
directive pour tcp et unix-socket php-fpm
Vous devez également exécuter les deux commandes suivantes après
Sudo service nginx reload
Sudo service php7.0-fpm restart
Pour vérifier, essayez de lancer
curl http://127.0.0.1/php_status