Nginx 1 FastCGI enviado em stderr: “Script primário desconhecido”

60

Minha primeira vez usando o Nginx, mas estou mais familiarizado com o Apache e o Linux. Estou usando um projeto existente e quando estou tentando ver o index.php eu 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 para 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 da www-data: www-data (meu usuário da web que executa php etc) e dei a ele 777 permissões por frustração ...

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

UPDATE Então eu 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 chamar localhost/console/frontend/www/index.php , recebo um PHP 500, o que significa que ele está sendo veiculado lá. Só não está servindo off console.ordercloud ...

    
por We0 20.06.2013 / 10:33

12 respostas

6

Ok, então 3 coisas que encontrei depois de um dia de dificuldades

  1. Por alguma razão eu já tinha algo rodando na porta 9000, então eu alterado para 9001
  2. Meu site padrão estava interceptando meu novo, mais uma vez eu não entenda por que desde que não deveria, mas eu apenas desvinculá-lo
  3. O Nginx não faz automaticamente o link sym para sites disponíveis para habilitado para sites.

Espero que isso poupe algum problema para alguém!

    
por 20.06.2013 / 12:00
83

A mensagem de erro "script primário desconhecido" está quase sempre relacionada a um conjunto errado SCRIPT_FILENAME na diretiva nginx fastcgi_param (ou permissões incorretas, veja outras respostas).

Você está usando um if na configuração que você postou primeiro. Bem, deve ser bem sabido agora que se é mal e muitas vezes produz problemas.

Definir a diretiva root dentro de 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;
    }
}

Por favor, note que a configuração acima não foi testada. Você deve executar nginx -t antes de aplicá-lo para verificar problemas que o nginx possa detectar imediatamente.

    
por 20.06.2013 / 18:50
36

Não é sempre que SCRIPT_FILENAME esteja errado.
Também pode ser que o PHP esteja sendo executado como usuário / grupo errado .

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

O problema é 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 ele inclui um subdiretório inteiro.

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

Em php-fpm.d , há um arquivo www.conf . 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 descobrir que isso corresponde a ls -lh do seu document_root)

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

"Primary script unknown" while reading response header from upstream

Verifique o que está sendo executado no momento:

ps aux | grep 'php-fpm'

ou mais claramente:

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

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

(roubado de igorsantos07 na outra resposta)

Adicione ao bloco http do principal /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 que você possa ver se está certo.)

E para usar o registro que você acabou de definir, no server block do seu site:

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

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

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

Você pode simplificar sua configuração existente?

Você está usando um bloco location ~ \.php { copiado / colado de algum lugar fora da Internet? A maioria dos pacotes permite que você faça isso de maneira mais rápida e limpa. por exemplo. no OS X, 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 em /usr/local/etc/nginx/snippets/fastcgi-php.conf .

Isso, por sua vez, inclui /usr/local/etc/nginx/fastcgi.conf , que é uma lista de fastcgi_param configurações, incluindo o crucial SCRIPT_FILENAME.

Nunca duplique root no bloco de localização do PHP.

    
por 06.02.2016 / 01:11
6

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

    
por 17.06.2015 / 11:24
3

"O script principal desconhecido" é causado pelo contexto de segurança do SELinux.

cliente obtém a resposta

File not found.

nginx error.log tem a seguinte mensagem de erro

*19 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

apenas altere o tipo de contexto de segurança da pasta raiz da Web para link

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




existem 3 usuários para 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

user-1 e user-2 não precisam ser iguais.

para o socket unix, user-1 precisa ser o mesmo que user-3, como nginx fastcgi_pass deve ter permissão de leitura / gravação no soquete unix.

caso contrário, o nginx obterá 502 Bad Gateway e o nginx error.log terá a seguinte mensagem de erro

*36 connect() to unix:/var/run/php-fpm/fpm-www.sock failed (13: Permission denied) while connecting to 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 3 usuários.

    
por 27.07.2017 / 17:05
2

Também tive este problema e resolvi-o trocando as linhas include fastcgi_params e fastcgi_param SCRIPT_FILENAME ... .

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

    
por 05.08.2015 / 21:39
1

Eu fiz tudo de cima, perdi 2 horas batendo com a cabeça e o problema ainda persistia. Finalmente eu fiz:

sudo service php7.0-fpm restart

E a viola funcionou!

Btw, eu estava configurando o novo projeto symfony 3.4 com nginx conf do link: link

Essa foi minha quinta vez de começar um novo projeto symfony e eu não pude acreditar que este "script primário desconhecido" está acontecendo.

    
por 12.03.2018 / 00:19
0

Eu encontrei sua pergunta procurando a mesma mensagem de erro, mas usando o apache + php-fpm (sem nginx). Para mim, o problema foi 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 forma:

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

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

    
por 04.08.2016 / 13:57
0

I meet the same question, But Other method didn't help me resolve the question!

I resolve it, I find the key is that: Linux User Right lead to the question: FastCGI sent in stderr: "Primary script unknown"

Because The PHP-FPM default user:group is apache:apache, But your code dir is someBody:someBody. So you should change the User right!

I write a blog to resolve this question, You can see this blog:

[Nginx FastCGI sent in stderr: "Primary script unknown"][1] ' [1]: http://geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary.html

    
por 01.06.2017 / 10:24
0

Eu 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 as informações do meu banco de dados local.

    
por 13.06.2017 / 02:16
0

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

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

tente reiniciar o nginx.

    
por 12.08.2018 / 19:38
-2

Tente adicionar a diretiva root no seu local do php.

location ~ \.php {
      root /home/willem/git/console/www;
      ...
}
    
por 20.06.2013 / 11:28