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

11

J'ai installé un serveur de test en utilisant 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 aux fichiers PHP, nginx génère une erreur 404

Résumant ce que j'ai essayé:

  • Réinstaller.
  • Modification des privilèges de script (les a changés en 0777).
  • fastcgi_intercept_errors on.
  • Vérifié la rootdirective aux niveaux: server, locationet location ~ \.php.
  • Vérifié la fastcgi_param SCRIPT_FILENAMEdirective.

Le serveur renvoie 404 sur (et uniquement sur) les .phpscripts. Je peux les renommer .htmlet 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;
        }


    }

}
arielnmz
la source

Réponses:

14

Résolu. Il s'avère que le problème était les autorisations définies sur le socket où php écoutait. Je devais changer une directive appelée listen.modesur/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, j'obtenais 404au lieu de 500ou 503parce que mon www.confétait configuré pour rediriger les erreurs vers des pages personnalisées , et comme elles n'étaient pas là, j'obtenais 404des erreurs .

É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'apache utilisateur, donc aucune configuration supplémentaire n'est nécessaire.

arielnmz
la source
À droite, vous devez contrôler: - Quel utilisateur / groupe exécuter nginx (ou n'importe quel serveur Web) - Quel utilisateur / groupe exécuter php-fpm
Dmitry Dubovitsky
0

J'ai en fait une erreur "Not Found" car un livre que j'ai lu m'a donné une chaîne de correspondance incorrecte pour le chemin /php_statusque 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 config pour defaulten /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 de manière à /php_statusne pas être accessible au public sur Internet (ni PHP n'est servi ni configuré pour l'hôte par défaut). Il comprend également une fastcgi_passdirective 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
MrMesees
la source