Minha primeira vez usando Nginx, mas estou mais do que familiarizado com Apache e Linux. Estou usando um projeto existente e sempre que tento 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 de sites disponíveis:
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 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 eu mudei /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á servindo lá. Ele simplesmente não está servindo no console.ordercloud ...
A mensagem de erro “script primário desconhecido” quase sempre está relacionada a uma configuração incorreta
SCRIPT_FILENAME
na diretiva nginxfastcgi_param
(ou permissões incorretas, veja outras respostas).Você está usando um
if
na configuração que postou primeiro. Bem, deve ser bem conhecido agora que se é mau e muitas vezes produz problemas.Definir a
root
diretiva dentro de um bloco de localização é uma prática ruim, é claro que funciona.Você pode tentar algo como o seguinte:
Observe que a configuração acima não foi testada. Você deve executá
nginx -t
-lo antes de aplicá-lo para verificar problemas que o nginx possa detectar imediatamente.Não é sempre que o
SCRIPT_FILENAME
está errado.Também pode ser que o PHP esteja rodando como usuário/grupo errado .
Este exemplo é específico para Mac OS X , que na minha experiência é o mais problemático de configurar (o Debian é fácil em comparação) - acabei de atualizar do PHP 5.6 para 7.0, usando 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 Pool Definitions no final, onde inclui um subdiretório inteiro.include=/usr/local/etc/php/7.0/php-fpm.d/*.conf
Nele
php-fpm.d
há umwww.conf
arquivo. Por padrão isso tem:No OS X, pode ser necessário alterar isso para:
(você deve achar que isso corresponde a um
ls -lh
de seu 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 .
Verifique como ele está sendo executado no momento:
ou mais limpo:
Como verificar se o nome do arquivo do script está correto:
(roubado de igorsantos07 na outra resposta)
Adicione ao
http
bloco de main/usr/local/etc/nginx/nginx.conf
:(onde o primeiro bit precisa ser o que você está usando no momento, para que você possa ver se está certo.)
server
E para usar o log que você acabou de definir, no bloco do seu site :Se estiver correto, solicitar example.com/phpinfo.php produzirá algo assim:
Você pode simplificar sua configuração existente?
Você está usando um
location ~ \.php {
bloco que você copiou/cola 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: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
uma lista defastcgi_param
configurações, incluindo o crucial SCRIPT_FILENAME.Nunca duplique
root
no bloco de localização do PHP.Ok, então 3 coisas que encontrei depois de um dia de luta
Espero que isso salve alguém algum problema!
Tive o mesmo problema com um nginx mais recente (v1.8). Versões mais recentes recomendam usar
snippets/fastcgi-php.conf;
em vez defastcgi.conf
. Portanto, se você copiar/colarinclude fastcgi.conf
de um tutorial, poderá acabar com oPrimary script unknown
erro no log."Script primário desconhecido" é causado pelo contexto de segurança do SELinux.
cliente obter a resposta
nginx error.log tem a seguinte mensagem de erro
então apenas altere o tipo de contexto de segurança da pasta raiz da web para httpd_sys_content_t
existem 3 usuários para a configuração do nginx/php-fpm
/etc/nginx/nginx.conf
/etc/nginx/conf.d/www.conf
/etc/php-fpm.d/www.conf
user-1 e user-2 não precisam ser iguais.
para o soquete unix, o usuário-1 precisa ser o mesmo que o usuário-3, pois o 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
e o usuário/grupo da pasta raiz da web (/var/www/show) não precisa ser igual a nenhum desses 3 usuários.
Eu também tive esse problema e resolvi trocando as linhas
include fastcgi_params
efastcgi_param SCRIPT_FILENAME ...
.De fato, o nginx define o último valor de cada parâmetro FastCGI, então você deve colocar seu valor após o valor padrão incluído em fastcgi_params.
I solved this problem by closing SELINUX in CentOS7.3 system
steps:
setenforce 0
vim /etc/selinux/config set SELINUX to disabled
Verifique as permissões do seu arquivo php-fpm sock, de alguma forma ele não estava acessível:
chmod 755 /usr/local/var/run/php-fpm.sock
em seguida, tente reiniciar o nginx.
Tente adicionar a diretiva root no seu local do php.
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:
Colocando a última barra após o número da porta assim:
o problema desapareceu para mim. Talvez você possa fazer algo semelhante