127 votes

Nginx 1 FastCGI envoyé dans stderr: "Script primaire inconnu"

Ma première fois en utilisant Nginx, mais je suis plus que familier avec Apache et Linux. J'utilise un projet existant et chaque fois que j'essaie de voir le index.php je reçois une erreur 404 Fichier non trouvé.

Voici l'entrée du fichier access.log:

2013/06/19 16:23:23 [error] 2216#0: *1 FastCGI a envoyé dans stderr : "Script principal inconnu" lors de la lecture de l'en-tête de réponse en amont, client : 127.0.0.1, serveur : localhost, requête : "GET /index.php HTTP/1.1", en amont : "fastcgi://127.0.0.1:9000", hôte : "www.ordercloud.lh"

Et voici le fichier sites-available:

serveur {
    définit $chemin_hôte "/home/willem/git/console/www";
    access_log  /www/logs/console-access.log  main;

    server_name  console.ordercloud;
    root   $chemin_hôte/htdocs;
    définit $yii_bootstrap "index.php";

    charset utf-8;

    location / {
        index  index.html $yii_bootstrap;
        try_files $uri $uri/ /$yii_bootstrap?$args;
    }

    location ~ ^/(protected|framework|themes/\w+/views) {
        refuse  all;
    }

    #éviter le traitement des appels aux fichiers statiques inexistants par yii
    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
        try_files $uri =404;
    }

    # faire passer les scripts PHP au serveur FastCGI écoutant sur 127.0.0.1:9000
    #
    location ~ \.php {
        fastcgi_split_path_info  ^(.+\.php)(.*)$;

        #laisser yii intercepter les appels aux fichiers PHP inexistants
        définit $fsn /$yii_bootstrap;
        si (-f $document_root$fastcgi_script_name){
            définit $fsn $fastcgi_script_name;
        }

        fastcgi_pass   127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;

        #PATH_INFO et PATH_TRANSLATED peuvent être omis, mais RFC 3875 les spécifie pour CGI
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
    }

    location ~ /\.ht {
        refuse  all;
    }
}

Mon /home/willem/git/console appartient à www-data:www-data (mon utilisateur web exécutant php etc) et je lui ai donné des autorisations 777 par frustration...

Mon meilleur pari est qu'il y a quelque chose qui ne va pas avec la configuration, mais je ne peux pas le comprendre...

MISE À JOUR Donc je l'ai déplacé à /var/www/ et utilisé une configuration beaucoup plus basique:

serveur {
    #écoute   80; ## écoute pour ipv4 ; cette ligne est par défaut et implicite
    #écoute   [::]:80 ipv6 seulement par défaut = activé ; ## écoute pour ipv6

    root /var/www/;
    index index.html index.htm;

    #Rendre le site accessible depuis http://localhost/
    server_name console.ordercloud;

    location / {
        root           /var/www/console/frontend/www/;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www;
            include        fastcgi_params;
    }

    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
            try_files $uri =404;
        }

    location /doc/ {
        alias /usr/share/doc/;
        autoindex on;
        allow 127.0.0.1;
        refuse all;
    }

}

Aussi si j'appelle localhost/console/frontend/www/index.php je reçois un 500 PHP ce qui signifie qu'il est servi là. Il ne sert tout simplement pas à partir de console.ordercloud...

0 votes

Une autre cause possible : Si vous utilisez php-fpm, assurez-vous que l'utilisateur défini dans /etc/php-fpm.d/www.conf a les autorisations nécessaires pour exécuter le script. Je pense que par défaut, il est défini sur apache.

0 votes

Une autre cause possible est que votre SElinux est activé, vérifiez la configuration SElinux et désactivez-le.

0 votes

Je viens de passer ma configuration d'hébergement de FCGId (exécuté en tant que propriétaire de serveur virtuel) à FPM (exécuté en tant que propriétaire de serveur virtuel). En plus d'installer PhP 7.2-fpm, cli et plus encore ...

135voto

Fleshgrinder Points 3558

Le message d'erreur "script principal inconnu" est presque toujours lié à un SCRIPT_FILENAME mal configuré dans la directive fastcgi_param de nginx (ou des permissions incorrectes, voir les autres réponses).

Vous utilisez un if dans la configuration que vous avez publiée en premier. Eh bien, il devrait être maintenant bien connu que if est maléfique et provoque souvent des problèmes.

Il est mauvais pratique de définir la directive root dans un bloc location, même si cela fonctionne bien sûr.

Vous pourriez essayer quelque chose comme ce qui suit:

server {
    location / {
        location ~* \.php$ {
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass 127.0.0.1:9000;
            try_files $uri @yii =404;
        }
    }
    location @yii {
        fastcgi_param SCRIPT_FILENAME $document_root$yii_bootstrap;
    }
}

Veuillez noter que la configuration ci-dessus n'a pas été testée. Vous devriez exécuter nginx -t avant de l'appliquer pour vérifier les problèmes que nginx peut détecter immédiatement.

2 votes

Cela a résolu le problème pour moi; je n'étais pas au courant qu'il fallait préfixer $document_root, je pensais que cela se faisait automatiquement, en se basant sur la racine.

0 votes

Après la mise à niveau du système, tout était cassé, j'ai trouvé cette réponse et $document_root m'a également aidé. Pourquoi mon serveur fonctionnait correctement avant la mise à niveau?

0 votes

Impossible de dire sans la configuration complète.

74voto

William Turrell Points 761

Ce n'est pas toujours que le SCRIPT_FILENAME est incorrect.
Cela peut aussi être que PHP s'exécute en tant qu'utilisateur/groupe incorrect.

Cet exemple est spécifique à Mac OS X, qui à mon avis est le plus difficile à configurer (Debian est facile en comparaison) - Je viens de passer de PHP 5.6 à 7.0, en utilisant homebrew et les excellents paquets de josegonzalez.

Le problème était qu'une nouvelle copie des fichiers de configuration a été créée.

Le fichier de configuration principal est /usr/local/etc/php/7.0/php-fpm.conf, mais notez la section des Définitions de Pool à la fin où il inclut tout un sous-répertoire.

include=/usr/local/etc/php/7.0/php-fpm.d/*.conf

Dans php-fpm.d il y a un fichier www.conf. Par défaut, cela contient :

user = _www
group = _www

Sous OS X, vous devez peut-être changer cela en :

user = [votre nom d'utilisateur]
group = staff

(vous devriez trouver que cela correspond à un ls -lh de votre document_root)

Malheureusement, sans ce changement, vous verrez toujours ceci dans votre journal d'erreurs Nginx même s'il cherche le fichier au bon endroit.

"Script principal inconnu" lors de la lecture de l'en-tête de réponse en amont

Vérifiez ce sur quoi il s'exécute actuellement :

ps aux | grep 'php-fpm'

ou de manière plus propre :

ps aux | grep -v root | grep php-fpm | cut -d\  -f1 | sort | uniq

Comment vérifier si le nom de fichier du script est correct :

(volé à igorsantos07 dans l'autre réponse)

Ajoutez au bloc http du principal /usr/local/etc/nginx/nginx.conf:

log_format scripts '$document_root$fastcgi_script_name > $request';

(où la première partie doit être ce que vous utilisez actuellement, donc vous pouvez voir si c'est correct.)

Et pour utiliser le journal que vous venez de définir, dans le bloc server de votre site :

access_log /var/log/nginx/scripts.log scripts;

Si c'est correct, en demandant example.com/phpinfo.php produira quelque chose comme ceci :

/chemin/vers/docroot/phpinfo.php > GET /phpinfo.php

Pouvez-vous simplifier votre configuration existante ?

Utilisez-vous un bloc location ~ \.php { que vous avez copié/collé depuis quelque part sur Internet ? La plupart des packages vous permettent de le faire plus rapidement et proprement. Par exemple, sur OS X, vous avez maintenant juste besoin de ceci :

location ~ \.php {
    fastcgi_pass 127.0.0.1:9000;
    include snippets/fastcgi-php.conf;

    # tout paramètre spécifique au site, par exemple des variables d'environnement
}

Des choses comme fastcgi_split_path_info, try_files et fastcgi_index (par défaut sur index.php) sont dans /usr/local/etc/nginx/snippets/fastcgi-php.conf.

Celui-ci inclut /usr/local/etc/nginx/fastcgi.conf qui est une liste de paramètres fastcgi_param, y compris le crucial SCRIPT_FILENAME.

Ne dupliquez jamais root dans le bloc de localisation PHP.

5 votes

Très bien! était-ce pour moi! Santé mon ami!

0 votes

Merci. Pour moi, les conteneurs docker fpm/nginx que j'exécutais rencontraient des problèmes d'autorisation pour accéder à ces dossiers.

0 votes

La réponse de @Fleshgrinder est fausse et la vôtre est correcte! Dans mon cas, il s'agissait en effet seulement de corriger la propriété dans le fichier /etc/php/7.0/php-fpm.d/www.conf. Bravo à vous, mon pote. :) De plus en plus de personnes pourraient rencontrer ce problème à mesure que la popularité de Vagrant continue de croître.

10voto

We0 Points 1349

D'accord, alors 3 choses que j'ai trouvées après une journée de lutte

  1. Pour une raison quelconque, j'avais déjà quelque chose qui tournait sur le port 9000 donc j'ai changé à 9001
  2. Mon site par défaut interceptait le nouveau, une fois de plus je ne comprends pas pourquoi puisque cela ne devrait pas, mais je l'ai juste désactivé
  3. Nginx ne crée pas automatiquement le lien symbolique de sites-available vers site-enabled.

J'espère que cela évitera des ennuis à quelqu'un!

0 votes

Bonjour @we0, J'ai rencontré le même problème avec ma configuration. J'ai également lancé une autre application sur le port 3001, donc j'ai dû héberger mon application php sur le port 3002. vous pouvez voir mon message original ici : stackoverflow.com/questions/33229867/… et stackoverflow.com/questions/33409539/… et un autre est stackoverflow.com/questions/33519989/…. Avez-vous une idée?

5 votes

Automatiser la création de liens symboliques de sites-available vers sites-enabled ne serait pas souhaitable. C'est à vous de créer ces liens symboliques afin de pouvoir contrôler quels sites sont 'activés' et lesquels sont 'désactivés' sur votre serveur.

1 votes

@Erathiel s/indésirable/absurdité. C'est l'idée principale les activer et les désactiver en utilisant ces liens symboliques.

10voto

Stargazer712 Points 8764

"Script principal inconnu" est causé par le contexte de sécurité SELinux.

le client reçoit la réponse

Fichier non trouvé.

le fichier de logs d'erreur de nginx contient le message d'erreur suivant

*19 FastCGI envoyé dans stderr: "Script principal inconnu" lors de la lecture de l'en-tête de réponse de l'amont

il suffit donc de changer le type de contexte de sécurité du dossier racine du site web en httpd_sys_content_t

chcon -R -t httpd_sys_content_t /var/www/show

il y a 3 utilisateurs pour la configuration de nginx/php-fpm

/etc/nginx/nginx.conf

user nobody nobody;  ### `user-1`, c'est l'utilisateur qui exécute le processus ouvrier de nginx
...
include servers/*.conf;

/etc/nginx/conf.d/www.conf

location ~ \.php$ {
#   fastcgi_pass 127.0.0.1:9000;  # socket tcp
    fastcgi_pass unix:/var/run/php-fpm/fpm-www.sock;  # socket unix
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

/etc/php-fpm.d/www.conf

[www]
user = apache  ### `user-2`, c'est l'utilisateur qui exécute le processus du pool php-fpm
group = apache

;listen = 127.0.0.1:9000  # socket tcp
listen = /var/run/php-fpm/fpm-www.sock  # socket unix

listen.onwer = nobody  ### `user-3`, c'est l'utilisateur pour le socket unix, comme /var/run/php-fpm/fpm-www.sock
listen.group = nobody  # pour le socket tcp, ces lignes peuvent être commentées
listen.mode = 0660

user-1 et user-2 ne doivent pas nécessairement être les mêmes.

pour le socket unix, user-1 doit être le même que user-3, car nginx fastcgi_pass doit avoir la permission de lecture/écriture sur le socket unix.

sinon nginx obtiendra un 502 Bad Gateway, et le fichier de logs d'erreur de nginx contiendra le message d'erreur suivant

*36 connect() à unix:/var/run/php-fpm/fpm-www.sock a échoué (13: Permission refusée) lors de la connexion à l'amont

et l'utilisateur/le groupe du dossier racine du site web (/var/www/show) ne doit pas nécessairement être le même que l'un de ces 3 utilisateurs.

9voto

Dan Dascalescu Points 550

J'ai eu le même problème avec une version plus récente de nginx (v1.8). Les versions plus récentes recommandent d'utiliser snippets/fastcgi-php.conf; au lieu de fastcgi.conf. Donc si vous avez copié/collé include fastcgi.conf à partir d'un tutoriel, vous pourriez vous retrouver avec l'erreur Script principal inconnu dans le journal.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X