Nginx 1 FastCGI enviado no stderr: “Script Primário Desconhecido”

81

Minha primeira vez usando o Nginx, mas estou mais do que familiarizado com Apache e Linux. Estou usando um projeto existente e sempre que estou tentando ver o index.php recebo um arquivo 404 não encontrado.

Aqui está a entrada 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"

E aqui está o arquivo disponível nos 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;
    }
}

Meu / home / willem / git / console é de propriedade de www-data: www-data (meu usuário da web executando php etc) e eu dei 777 permissões por frustração ...

Meu melhor palpite é que algo está errado com a configuração, mas não consigo descobrir ...

UPDATE Então mudei para /var/www/e usei uma configuração muito mais básica:

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

}

Além disso, se eu ligar localhost/console/frontend/www/index.php, recebo um PHP 500, o que significa que ele está servindo lá. Apenas não está servindo fora do console.ordercloud ...

We0
fonte
Outra causa possível: Se você estiver usando o php-fpm, verifique se o usuário definido em /etc/php-fpm.d/www.conf possui permissões para o script que está tentando executar. Eu acho que o padrão é apache.
Dave
Outra possível causa do seu SElinux estar ativado, faça o checkout da configuração do SElinux e desative-o.
CK.Nguyen
Acabei de mudar minha configuração de host de FCGId (executado como proprietário do servidor virtual) para FPM (executado como proprietário do servidor virtual). Além de instalar o PHP 7.2-fpm, cli e muito mais ...
PauloBoaventura

Respostas:

92

A mensagem de erro "script primário desconhecido" quase sempre está relacionada a um conjunto incorreto SCRIPT_FILENAMEna fastcgi_paramdiretiva nginx (ou permissões incorretas, consulte outras respostas).

Você está usando um ifna configuração que postou primeiro. Bem, agora deve ser sabido que se é mau e muitas vezes produz problemas.

Definir a rootdiretiva em um bloco de localização é uma prática ruim, é claro que funciona.

Você pode tentar algo como o seguinte:

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

Observe que a configuração acima não foi testada. Você deve executar nginx -tantes de aplicá-lo para verificar problemas que o nginx pode detectar imediatamente.

Triturador de Carne
fonte
1
Isso resolve para mim; Eu não sabia que você tinha que prefixar $ document_root, presumi que o fizesse automaticamente, com base no root.
b01
3
Onde podemos aprender mais sobre as más práticas de definir o rootlocal interno?
Dan Dascalescu
15
Para aqueles que não entendem exatamente como a variável pode estar errado: adicionar à principal Nginx httpseção o seguinte: log_format scripts '$document_root$fastcgi_script_name > $request';(ou o que você está alimentando a SCRIPT_FILENAME), e para o seu server: access_log /var/log/nginx/scripts.log scripts. Recarregue e dê uma olhada no seu novo log de scripts;)
igorsantos07
3
Qual é o yii_bootstrap?
Amor
43

Nem sempreSCRIPT_FILENAME é o que está errado.
Também pode ser que o PHP esteja sendo executado como o usuário / grupo errado .

Este exemplo é específico para o Mac OS X , que na minha experiência é o mais problemático de configurar (o Debian é fácil em comparação) - Acabei de atualizar o PHP 5.6 para 7.0, usando o homebrew e os excelentes pacotes josegonzalez.

O problema foi que uma nova cópia dos arquivos de configuração foi criada.

O arquivo de configuração principal é /usr/local/etc/php/7.0/php-fpm.conf, mas observe a seção Definições de Pool no final, onde inclui um subdiretório inteiro.

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

Em php-fpm.dhá um www.confarquivo. Por padrão, isso tem:

user = _www
group = _www

No OS X, pode ser necessário alterar isso para:

user = [your username]
group = staff

(você deve achar que isso corresponde a um ls -lhdos seus document_root)

Infelizmente, sem essa alteração, você ainda verá isso no log de erros do Nginx, mesmo que esteja procurando o arquivo no local correto .

"Primary script unknown" while reading response header from upstream

Verifique como está sendo executado no momento:

ps aux | grep 'php-fpm'

ou mais limpa:

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

Como verificar se o nome do arquivo do script está correto:

(roubado de igorsantos07 na outra resposta)

Adicionar ao httpbloco de main /usr/local/etc/nginx/nginx.conf:

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

(onde o primeiro bit precisa ser o que você está usando no momento, para ver se está correto.)

E para usar o log que você acabou de definir, no serverbloco do seu site :

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

Se estiver correto, solicitar example.com/phpinfo.php produzirá algo como isto:

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

Você pode simplificar sua configuração existente?

Você está usando um location ~ \.php {bloco que copiou / colou de algum lugar fora da Internet? A maioria dos pacotes permite que você faça isso de forma mais rápida e limpa. Por exemplo, no OS X, agora você só precisa disso:

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

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

Coisas como fastcgi_split_path_info, try_files e fastcgi_index (o padrão é index.php) estão /usr/local/etc/nginx/snippets/fastcgi-php.conf.

Isso, por sua vez, inclui /usr/local/etc/nginx/fastcgi.confuma lista de fastcgi_paramconfigurações, incluindo o SCRIPT_FILENAME crucial.

Nunca duplique rootno bloco de localização do PHP.

William Turrell
fonte
2
muito agradável! foi isso para mim! Cheers companheiro!
precisa saber é o seguinte
Obrigado. Para mim, os contêineres do docker fpm / nginx que eu estava executando tinham problemas de permissão para acessar essas pastas.
Tek
@ A resposta do Fleshgrinder está errada e a sua está certa! No meu caso, era, de fato, apenas uma questão de corrigir a propriedade do /etc/php/7.0/php-fpm.d/www.confarquivo. Um brinde a você, amigo. :) Muitas outras pessoas podem começar a ver esse problema também, pois a popularidade vagante continua a crescer.
User392778
não poderia encontrar qualquer coisa dentro /usr/local/etc/nginx/snippets/fastcgi-php.confdo meu mac .. mas eu achei/usr/local/etc/nginx/fastcgi.conf
abbood
Agradável!! Estive lutando por horas
fonini 9/10
7

Ok, então três coisas que encontrei depois de um dia de luta

  1. Por alguma razão, eu já tinha algo em execução na porta 9000, então mudei para 9001
  2. Meu site padrão estava interceptando o meu novo, mais uma vez eu não entendo o porquê, pois não deveria, mas apenas desvinculei
  3. O Nginx não cria automaticamente o link sym para sites disponíveis para sites ativados.

Espero que isso evite problemas para alguém!

We0
fonte
Olá @ we0, estou enfrentando o mesmo problema com minha configuração. Também estou executando meu outro aplicativo na porta 3001, portanto, tenho que hospedar meu aplicativo php na porta 3002. você pode ver minha postagem original aqui: stackoverflow.com/questions/33229867/… e stackoverflow.com/questions/33409539/… e outro é stackoverflow.com/questions/33519989/… . Você tem alguma ideia?
Manish Sapkal
3
Tornar automaticamente links simbólicos de sites disponíveis para sites ativados seria indesejável. Cabe a você criar esses links simbólicos para poder controlar quais sites estão "ativados" e quais estão "desativados" em seu servidor.
Erathiel 2/08/16
6

Teve o mesmo problema com um nginx mais recente (v1.8). Versões mais recentes recomendam usar em snippets/fastcgi-php.conf;vez de fastcgi.conf. Portanto, se você copiar / colar include fastcgi.confde um tutorial, poderá acabar com o Primary script unknownerro no log.

Dan Dascalescu
fonte
4

"Script primário desconhecido" é causado pelo contexto de segurança do SELinux.

cliente obtém a resposta

Arquivo não encontrado.

nginx error.log possui a seguinte mensagem de erro

* 19 FastCGI enviado no stderr: "Script primário desconhecido" ao ler o cabeçalho de resposta do upstream

basta alterar o tipo de contexto de segurança da pasta raiz da web para httpd_sys_content_t

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




existem 3 usuários para a configuração nginx / php-fpm

/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

usuário-1 e usuário-2 não são necessários para ser o mesmo.

para soquete unix, o usuário-1 precisa ser igual ao usuário-3, pois o nginx fastcgi_pass deve ter permissão de leitura / gravação no soquete unix.

caso contrário, o nginx receberá o Gateway 502 inválido e o nginx error.log possui a seguinte mensagem de erro

* 36 connect () ao unix: /var/run/php-fpm/fpm-www.sock falhou (13: permissão negada) ao conectar-se ao upstream

e o usuário / grupo da pasta raiz da web (/ var / www / show) não é necessário para ser o mesmo que qualquer um desses três usuários.

PLA
fonte
2

Eu também tive esse problema e resolvi-o trocando as linhas include fastcgi_paramse fastcgi_param SCRIPT_FILENAME ....

Na verdade, o nginx define o último valor de cada parâmetro FastCGI, portanto, você deve colocar seu valor após o valor padrão incluído em fastcgi_params.

Seb35
fonte
1

Resolvi esse problema fechando o SELINUX no sistema CentOS7.3

passos:

  • exec setenforce 0
  • Você também precisa modificar o arquivo de configuração

vim /etc/selinux/config set SELINUX to disabled

Kent
fonte
0

Encontrei sua pergunta procurando a mesma mensagem de erro, mas usando apache + php-fpm (sem nginx). Para mim, o problema era uma barra no lugar errado: muitas sugestões de configuração incluem uma linha do formulário:

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

Colocando a última barra após o número da porta da seguinte maneira:

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

o problema desapareceu para mim. Talvez você possa fazer algo semelhante

cristão
fonte
0

Encontro a mesma pergunta, mas Outro método não me ajudou a resolver a questão!

Eu resolvo isso, acho que a chave é que: Usuário Linux Linux Certo leva à pergunta: FastCGI enviado no stderr: "Script primário desconhecido"

Porque o usuário padrão do PHP-FPM: group é apache: apache, mas seu diretório de código é someBody: someBody. Então você deve mudar o usuário certo!

Eu escrevo um blog para resolver esta pergunta. Você pode ver este blog:

[Nginx FastCGI enviado no stderr: "Script primário desconhecido"] [1] `[1]: http://geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary.html

Ame
fonte
0

Clonei um site remoto, e o wp-config.php já existente tinha as informações do banco de dados do servidor remoto.

Resolvi esse problema configurando minha configuração local do wordpress, com minhas informações do banco de dados local.

Shean Hoxie
fonte
0

Fiz tudo de cima, perdi duas horas batendo na cabeça e o problema ainda persistia. Finalmente eu fiz:

sudo service php7.0-fpm restart

E viola deu certo!

Btw, eu estava configurando um novo projeto symfony 3.4 com o nginx conf no link: https://symfony.com/doc/3.4/setup/web_server_configuration.html

Essa foi a minha quinta vez em iniciar um novo projeto symfony e eu não podia acreditar que este "script primário desconhecido" está acontecendo.

ermacmkx
fonte
0

Verifique as permissões do seu arquivo php-fpm sock, de alguma forma, não estava acessível:

chmod 755 /usr/local/var/run/php-fpm.sock

então tente reiniciar o nginx.

spetsnaz
fonte
0

Estou preso por essa mensagem estranha há muito tempo. Não tenho certeza da causa, porque tudo funcionou por um tempo e, de repente, parou de funcionar.

Eu estava diminuindo os URLs do wiki, conforme prescrito pelo MediaWiki, com o Bitnami / Nginx no Lightsail.

Pesquisei e li muitas postagens, esta parece resumir todos os cenários possíveis e tentei todos eles:

  • nginx está bom, php da pasta raiz está funcionando, a subpasta não está
  • erro lançado como 404 + uma sequência simples "Arquivo não encontrado", não pelo nginx
  • adicionar rootao servidor, não funcionou
  • verifique as permissões de pastas e php-fpm / nginx, nenhum problema de raiz e subpastas são os mesmos
  • verifique o manual php-fpm para a interpretação do código de erro, não foi possível encontrar um
  • ativar o log de acesso php-fpm, localizou o URI da solicitação correto, mas 404 foi retornado
  • tente ativar o modo detalhado / depuração para php-fpm, não funcionou, o suposto arquivo de log de erros está sempre vazio

Então eu tinha que tentar o último recurso, uma vez pasta raiz php estava trabalhando e subpastas não eram, a única grande diferença entre eles que não rooté pasta raiz usado $request_filenamee subpasta locais utilizados $document_roote $fastcgi_script_name, por isso, mudou as configurações de local subpasta para combinar os pasta raiz.

Então funcionou ... Ainda não sei por que funcionou. Porque, quando verifico o log de acesso php-fpm, vejo o mesmo URI, um era 404 e o outro, 200.

insira a descrição da imagem aqui

A única diferença estava na configuração. Como eles produzem a mesma saída, não sei por que o resultado foi diferente.

Enfim, decidi postar meus 2 centavos aqui, espero que ajude.

PS: Eu realmente espero que o PHP forneça melhores mensagens de erro e modo detalhado, porque isso é realmente frustrante não poder isolar o problema e não há como ver informações detalhadas de saída e depuração.

Dai
fonte
-1

Tente adicionar a diretiva raiz dentro da sua localização php.

location ~ \.php {
      root /home/willem/git/console/www;
      ...
}
lg.
fonte
1
A rootdiretiva deve ser definida por serverbase e não deve ser usada em nenhum locationbloco (a menos que você seja um profissional e queira contornar alguns erros nginx muito especiais em sua configuração).
Fleshgrinder
1
@Fleshgrinder uma raiz por servidor não é uma prática recomendada.
Garet Claborn
@Fleshgrinder Isso não é o que diz a seção que você vinculou. O exemplo de boas práticas nessa seção mostra uma rootdiretiva dentro de um locationbloco.
Ishigoya
@ishigoya, visite o link novamente, as várias rootdiretivas dentro de vários locationblocos estão claramente sob o cabeçalho MAU.
Fleshgrinder