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 ...
Respostas:
A mensagem de erro "script primário desconhecido" quase sempre está relacionada a um conjunto incorreto
SCRIPT_FILENAME
nafastcgi_param
diretiva nginx (ou permissões incorretas, consulte outras respostas).Você está usando um
if
na configuração que postou primeiro. Bem, agora deve ser sabido que se é mau e muitas vezes produz problemas.Definir a
root
diretiva em 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 executar
nginx -t
antes de aplicá-lo para verificar problemas que o nginx pode detectar imediatamente.fonte
root
local interno?http
seção o seguinte:log_format scripts '$document_root$fastcgi_script_name > $request';
(ou o que você está alimentando a SCRIPT_FILENAME), e para o seuserver
:access_log /var/log/nginx/scripts.log scripts
. Recarregue e dê uma olhada no seu novo log de scripts;)Nem sempre
SCRIPT_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.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
dos 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 .
Verifique como está sendo executado no momento:
ou mais limpa:
Como verificar se o nome do arquivo do script está correto:
(roubado de igorsantos07 na outra resposta)
Adicionar 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 ver se está correto.)
E para usar o log que você acabou de definir, no
server
bloco do seu site :Se estiver correto, solicitar example.com/phpinfo.php produzirá algo como isto:
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: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.conf
uma lista defastcgi_param
configurações, incluindo o SCRIPT_FILENAME crucial.Nunca duplique
root
no bloco de localização do PHP.fonte
/etc/php/7.0/php-fpm.d/www.conf
arquivo. Um brinde a você, amigo. :) Muitas outras pessoas podem começar a ver esse problema também, pois a popularidade vagante continua a crescer./usr/local/etc/nginx/snippets/fastcgi-php.conf
do meu mac .. mas eu achei/usr/local/etc/nginx/fastcgi.conf
Ok, então três coisas que encontrei depois de um dia de luta
Espero que isso evite problemas para alguém!
fonte
Teve o mesmo problema com um nginx mais recente (v1.8). Versões mais recentes recomendam usar em
snippets/fastcgi-php.conf;
vez defastcgi.conf
. Portanto, se você copiar / colarinclude fastcgi.conf
de um tutorial, poderá acabar com oPrimary script unknown
erro no log.fonte
"Script primário desconhecido" é causado pelo contexto de segurança do SELinux.
cliente obtém a resposta
nginx error.log possui a seguinte mensagem de erro
basta alterar 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 nginx / php-fpm
/etc/nginx/nginx.conf
/etc/nginx/conf.d/www.conf
/etc/php-fpm.d/www.conf
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
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.
fonte
Eu também tive esse problema e resolvi-o trocando as linhas
include fastcgi_params
efastcgi_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.
fonte
Resolvi esse problema fechando o SELINUX no sistema CentOS7.3
passos:
setenforce 0
vim /etc/selinux/config set SELINUX to disabled
fonte
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 da seguinte maneira:
o problema desapareceu para mim. Talvez você possa fazer algo semelhante
fonte
fonte
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.
fonte
Fiz tudo de cima, perdi duas horas batendo na cabeça e o problema ainda persistia. Finalmente eu fiz:
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.
fonte
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.
fonte
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:
root
ao servidor, não funcionouEntã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_filename
e subpasta locais utilizados$document_root
e$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.
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.
fonte
Tente adicionar a diretiva raiz dentro da sua localização php.
fonte
root
diretiva deve ser definida porserver
base e não deve ser usada em nenhumlocation
bloco (a menos que você seja um profissional e queira contornar alguns erros nginx muito especiais em sua configuração).root
diretiva dentro de umlocation
bloco.root
diretivas dentro de várioslocation
blocos estão claramente sob o cabeçalho MAU.