Vraag Nginx 1 FastCGI verzonden in stderr: "Primair script onbekend"


Mijn eerste keer dat ik Nginx gebruik, maar ik ben meer dan bekend met Apache en Linux. Ik gebruik een bestaand project en wanneer ik ooit de index.php probeer te zien krijg ik een 404-bestand niet gevonden.

Hier is de entry access.log:

2013/06/19 16:23:23 [error] 2216#0: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.ordercloud.lh"

En hier is het bestand met beschikbare sites:

server {
    set $host_path "/home/willem/git/console/www";
    access_log  /www/logs/console-access.log  main;

    server_name  console.ordercloud;
    root   $host_path/htdocs;
    set $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) {
        deny  all;
    }

    #avoid processing of calls to unexisting static files by yii
    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
        try_files $uri =404;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php {
        fastcgi_split_path_info  ^(.+\.php)(.*)$;

        #let yii catch the calls to unexising PHP files
        set $fsn /$yii_bootstrap;
        if (-f $document_root$fastcgi_script_name){
            set $fsn $fastcgi_script_name;
        }

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

        #PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
    }

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

Mijn / home / willem / git / console is eigendom van www-data: www-data (mijn webgebruiker met php etc) en ik heb het 777 permissies gegeven uit frustratie ...

Mijn beste gok is dat er iets mis is met de config, maar ik kan er niet achter komen ...

BIJWERKEN Dus ik heb het verplaatst naar /var/www/ en gebruikte een veel meer eenvoudige configuratie:

server {
    #listen   80; ## listen for ipv4; this line is default and implied
    #listen   [::]:80 default ipv6only=on; ## listen for ipv6

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

    # Make site accessible from 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;
        deny all;
    }

}

Ook als ik bel localhost/console/frontend/www/index.php Ik krijg een 500 PHP, wat betekent dat het daar dient. Het dient gewoon niet van console.ordercloud ...


58
2018-06-20 08:33


oorsprong


Een andere mogelijke oorzaak: als u php-fpm gebruikt, zorg er dan voor dat de gebruiker die is ingesteld in /etc/php-fpm.d/www.conf rechten heeft voor het script dat het probeert uit te voeren. Ik denk dat het standaard apache is. - Dave
Een andere mogelijke oorzaak dat uw SElinux is ingeschakeld, check SElinux config uit en schakel het uit. - CK.Nguyen


antwoorden:


De foutmelding "Primair script onbekend" is bijna altijd gerelateerd aan een verkeerd ingesteld SCRIPT_FILENAME in de nginx fastcgi_param richtlijn (of onjuiste rechten, zie andere antwoorden).

Je gebruikt een if in de configuratie die u als eerste hebt gepost. Welnu, dat zou nu wel bekend moeten zijn als is het kwaad en levert vaak problemen op.

Het instellen van root richtlijn binnen een locatieblok is een slechte gewoonte, natuurlijk werkt het.

Je zou iets als het volgende kunnen proberen:

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;
    }
}

Houd er rekening mee dat de bovenstaande configuratie niet getest is. Je zou moeten uitvoeren nginx -t voordat het wordt toegepast om te controleren op problemen die nginx meteen kan detecteren.


80
2018-06-20 16:50



Dit lost het voor mij op; Ik wist niet dat je $ document_root als voorvoegsel moest gebruiken, ik ging ervan uit dat dit automatisch deed, op basis van root. - b01
Waar kan iemand meer leren over de slechte praktijk van het instellen van de root binnen locatie? - Dan Dascalescu
Voor degenen die niet precies begrijpen hoe de variabele fout kan zijn: toevoegen aan hoofd Nginx http deel het volgende: log_format scripts '$document_root$fastcgi_script_name > $request'; (of wat u ook toevoegt aan SCRIPT_FILENAME) en aan uw server: access_log /var/log/nginx/scripts.log scripts. Herladen en een kijkje nemen in je nieuwe scriptlogboek;) - igorsantos07
Ja tuurlijk: nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/... - Fleshgrinder
Wat is de yii_bootstrap? - Love


Het is niet altijd dat de SCRIPT_FILENAME is fout.
Het kan ook zijn PHP wordt uitgevoerd als de verkeerde gebruiker / groep.

Dit voorbeeld is specifiek voor Mac OS X, wat naar mijn ervaring de lastigste is om in te stellen (Debian is eenvoudig in vergelijking) - Ik heb zojuist een upgrade van PHP 5.6 naar 7.0 uitgevoerd homebrew en de uitstekende josegonzalez-pakketten.

Het probleem was dat een nieuw exemplaar van de configuratiebestanden werd gemaakt.

Het belangrijkste configuratiebestand is /usr/local/etc/php/7.0/php-fpm.conf, maar let op het Pooldefinities sectie aan het einde waar het een hele submap bevat.

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

In php-fpm.d er is een www.conf het dossier. Standaard heeft dit:

user = _www
group = _www

Op OS X moet u dit mogelijk wijzigen in:

user = [your username]
group = staff

(je zou deze overeenkomsten moeten vinden ls -lh van uw document_root)

Helaas, zonder deze wijziging, ziet u dit nog steeds in uw Nginx-foutenlogboek zelfs als het op zoek is naar het bestand op de juiste plaats.

"Primary script unknown" while reading response header from upstream

Controleer wat het momenteel uitvoert als:

ps aux | grep 'php-fpm'

of meer netjes:

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

Hoe te controleren of de bestandsnaam van het script correct is:

(gestolen uit igorsantos07 in het andere antwoord)

Toevoegen aan http blok van main /usr/local/etc/nginx/nginx.conf:

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

(waarbij het eerste bit moet zijn wat u op dit moment gebruikt, zodat u kunt zien of het goed is)

En om het logboek te gebruiken dat u zojuist hebt gedefinieerd, op uw site server blok:

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

Als het correct is, zal het aanvragen van example.com/phpinfo.php iets als dit produceren:

/path/to/docroot/phpinfo.php > GET /phpinfo.php

Kunt u uw bestaande configuratie vereenvoudigen?

Gebruikt u een location ~ \.php { blokkeer je gekopieerd / geplakt ergens buiten het internet? Bij de meeste pakketten kunt u het sneller en overzichtelijker doen. bijv. op OS X heb je nu alleen dit nodig:

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

    # any site specific settings, e.g. environment variables
}

Dingen zoals fastcgi_split_path_info, try_files en fastcgi_index (standaard naar index.php) zijn in /usr/local/etc/nginx/snippets/fastcgi-php.conf.

Dat omvat op zijn beurt /usr/local/etc/nginx/fastcgi.conf wat een lijst is van fastcgi_param instellingen, inclusief de cruciale SCRIPT_FILENAME.

Dupliceer nooit root in het PHP-locatieblok.


34
2018-02-06 00:11



heel aardig! was dat voor mij! Proost vriend! - rollsappletree
Bedankt. Voor mij hadden de fpm / nginx dockercontainers die ik aan het draaien was toestemming om deze mappen te openen. - Tek
Het antwoord van @ Fleshgrinder is fout en de jouwe heeft gelijk! In mijn geval was het inderdaad enkel en alleen een kwestie van het corrigeren van het eigendom in de /etc/php/7.0/php-fpm.d/www.conf het dossier. Groeten aan jou, vriend. :) Veel meer mensen kunnen dit probleem ook gaan zien, omdat de populariteit van zwervers blijft toenemen. - user392778
kon niets binnen vinden /usr/local/etc/nginx/snippets/fastcgi-php.conf op mijn mac .. maar ik vond /usr/local/etc/nginx/fastcgi.conf - abbood


Ok, dus 3 dingen die ik vond na een dag worstelen

  1. Om de een of andere reden had ik al iets op poort 9000, dus ik veranderd naar 9001
  2. Mijn standaardsite was mijn nieuwe onderscheppen, nogmaals niet begrijp waarom, omdat het niet zou moeten, maar ik heb het gewoon losgekoppeld
  3. Nginx doet niet automatisch de sym-link voor sites-beschikbaar voor Het terrein ingeschakeld.

Ik hoop dat dit iemand wat problemen bespaart!


6
2018-06-20 10:00



hallo @ we0, ik heb hetzelfde probleem ondervonden met mijn installatie. Ik heb ook mijn andere app op poort 3001 uitgevoerd, dus ik moet mijn php-app hosten op poort 3002. je kunt mijn originele bericht hier zien: stackoverflow.com/questions/33229867/... en stackoverflow.com/questions/33409539/... en een andere is stackoverflow.com/questions/33519989/.... Heb je enig idee? - Manish Sapkal
Het automatisch maken van symlinks van sites-beschikbaar voor sites-ingeschakeld zou, nou, ongewenst zijn. Het is aan u om die symlinks te maken, zodat u kunt bepalen welke sites 'aan' staan ​​en welke 'uit' zijn op uw server. - Erathiel


Had hetzelfde probleem met een nieuwere nginx (v1.8). Nieuwere versies bevelen aan om te gebruiken snippets/fastcgi-php.conf; in plaats van fastcgi.conf. Dus als je kopieert / plakt include fastcgi.conf vanuit een tutorial kom je misschien bij de Primary script unknown fout in het logboek.


6
2018-06-17 09:24





"Primair script onbekend" wordt veroorzaakt door SELinux beveiligingscontext.

cliënt krijgt het antwoord

Bestand niet gevonden.

nginx error.log heeft het volgende foutbericht

* 19 FastCGI verzonden in stderr: "Primair script onbekend" tijdens het lezen van responskop van stroomopwaarts

dus verander gewoon het type beveiligings-context van de web-rootmap naar httpd_sys_content_t

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




er zijn 3 gebruikers voor nginx / php-fpm config

/etc/nginx/nginx.conf

user nobody nobody;  ### `user-1`, this is the user run nginx woker process
...
include servers/*.conf;

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

location ~ \.php$ {
#   fastcgi_pass 127.0.0.1:9000;  # tcp socket
    fastcgi_pass unix:/var/run/php-fpm/fpm-www.sock;  # unix socket
    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`, this is the user run php-fpm pool process
group = apache

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

listen.onwer = nobody  ### `user-3`, this is the user for unix socket, like /var/run/php-fpm/fpm-www.sock
listen.group = nobody  # for tcp socket, these lines can be commented
listen.mode = 0660

gebruiker-1 en gebruiker-2 hoeven niet hetzelfde te zijn.

voor unix socket, moet user-1 hetzelfde zijn als user-3, aangezien nginx fastcgi_pass een lees- / schrijfmachtiging op de unix-socket moet hebben.

anders krijgt nginx 502 Bad Gateway, en nginx error.log heeft het volgende foutbericht

* 36 connect () met unix: /var/run/php-fpm/fpm-www.sock failed (13: toestemming geweigerd) tijdens het verbinden met upstream

en de gebruiker / groep webrootmap (/ var / www / show) hoeft niet hetzelfde te zijn als een van deze 3 gebruikers.


3
2017-07-27 15:05





Ik had dit probleem ook en ik loste het op door de regels uit te wisselen include fastcgi_params en fastcgi_param SCRIPT_FILENAME ....

Nginx stelt namelijk de laatste waarde van elke FastCGI-parameter in, dus u moet uw waarde achter de standaardwaarde in fastcgi_params zetten.


2
2017-08-05 19:39





Ik deed alles van boven, verloor 2 uur op mijn hoofd en het probleem hield nog steeds aan. Eindelijk deed ik:

sudo service php7.0-fpm restart

En viola het werkte!

Trouwens, ik was bezig met het opzetten van een nieuw symfony 3.4-project met nginx conf uit de link: https://symfony.com/doc/3.4/setup/web_server_configuration.html

Dat was mijn vijfde keer van het begin van een nieuw symfony-project en ik kon niet geloven dat dit 'Primaire script onbekend' aan de gang is.


1
2018-03-11 23:19





Ik vond je vraag op zoek naar dezelfde foutmelding maar met apache + php-fpm (no nginx). Voor mij was het probleem een ​​schuine streep op de verkeerde plaats: veel instellingssuggesties bevatten een regel van het formulier:

SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost/:9000"

Door de laatste schuine streep na het poortnummer als volgt te plaatsen:

SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost:9000/"

het probleem verdween voor mij. Misschien kun je iets soortgelijks doen


0
2017-08-04 11:57