web-dev-qa-db-fra.com

Nginx lance 404 uniquement sur les scripts php utilisant php-fpm

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é:

  • Réinstaller.
  • Modification des privilèges de script (changez-les en 0777).
  • fastcgi_intercept_errors on.
  • Vérification de la directive root aux niveaux: server, location et location ~ \.php.
  • Vérifié le 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;
        }


    }

}
11
arielnmz

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.

14
arielnmz

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 également fastcgi_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
0
MrMesees