nginx mostrando páginas PHP em branco


164

Eu configurei um servidor nginx com php5-fpm. Quando tento carregar o site, recebo uma página em branco sem erros. Páginas HTML são servidas bem, mas não php. Eu tentei ativar display_errors no php.ini, mas sem sorte. O php5-fpm.log não está produzindo nenhum erro e nem o nginx.

nginx.conf

server {
    listen 80;
    root /home/mike/www/606club;
    index index.php index.html;
    server_name mikeglaz.com www.mikeglaz.com;
    error_log /var/log/nginx/error.log;
    location ~ \.php$ {
            #fastcgi_pass 127.0.0.1:9000;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    }
}

EDITAR

aqui está o meu log de erro do nginx:

2013/03/15 03:52:55 [error] 1020#0: *55 open() "/home/mike/www/606club/robots.txt" failed (2: No such file or directory), client: 199.30.20.40, server: mikeglaz.com, request: "GET /robots.txt HTTP/1.1", host: "mikeglaz.com"

1
Aparentemente, o php-fpm não foi chamado pelo nginx, você verificou o log de erros do nginx?
adamsmith

Verifique minha atualização acima.
Mike Glaz

O erro nginx connect() failed ... fastcgi://127.0.0.1:9000contradiz o seu nginx conf, recarrega o nginx conf?
adamsmith

Eu acho que isso está certo.
Mike Glaz

2
Estou realmente surpreso que isso pareça afetar apenas alguns milhares de pessoas no planeta, pois mesmo a configuração padrão do nginx + php causa isso.
Sliq

Respostas:


250

Para referência, estou anexando meu locationbloco para captura de arquivos com a .phpextensão:

location ~ \.php$ {
    include /path/to/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
}

Verifique duas vezes /path/to/fastcgi-paramse verifique se ele está presente e legível pelo usuário nginx.


3
sua solução fazia parte dela. A outra parte é aqui wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
Mike Glaz

154
a última linha com 'SCRIPT_FILENAME' fez o truque para mim :) obrigada
Stijn Leenknegt

3
obrigado, essa última linha fez o truque (não é necessário ao usar a versão 1.0 do nginx que acompanha o Centos). Eu adoraria ver a documentação em torno de tudo isso melhorar.
Jorre

1
De nada, fico feliz em saber que ainda ajuda as pessoas depois de todos esses anos. No entanto, observe a resposta atualizada do @ spacepile abaixo, que provavelmente é melhor.
Julian H. Lam

2
Encontrei o mesmo problema e a solução para mim foi adicionar o SCRIPT_FILENAME conforme descrito aqui (sem a barra /). Mas o que me deixou louco é por que eu realmente preciso fazer isso? Tivemos outra instalação do nginx (anterior a 1.9) e não foi necessária esta linha. Encontrei este nginx.com/resources/wiki/start/topics/examples/phpfcgi e, se você o comparar com seus fastcgi_params, verá que provavelmente não é o mesmo que a versão online listada e verá que SCRIPT_FILENAME não está lá. Por que isso? Go figure ... #
7267 Daniel Dimitrov

342

substituir

include fastcgi_params;

com

include fastcgi.conf;

e remova fastcgi_param SCRIPT_FILENAME ... no nginx.conf


17
Isso consertou para mim. O .conftem uma configuração extra parâmetro faltando _params.
Malvineous

7
Isso (e, é claro /etc/init.d/nginx restart) também o corrigiu no Debian Testing após uma nginxatualização em 10 de setembro de 2014.
severin

6
Isso foi corrigido para mim também após a atualização do nginx para 1.6.2 (atualização de setembro de 2014). Tenho que amar atualizações que quebram as coisas aleatoriamente.
Mahn

30
Aqui está o histórico de fastcgi_paramsvs fastcgi.conf: blog.martinfjordvald.com/2013/04/…
Levite

4
Este código não funciona - não sei por que; Esse código funciona, não sei por quê. você me salvou várias horas.
Alex

54

Também tive esse problema e finalmente encontrei a solução aqui . Em resumo, você precisa adicionar a seguinte linha ao seu arquivo de configuração nginx fastcgi (/ etc / nginx / fastcgi_params no Ubuntu 12.04)

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
Muito obrigado, isso foi corrigido no Ubuntu 12.04 LTS.
Valentin Klinghammer

2
Corrigido para mim também após a atualização do nginx 1.5.4 -> 1.7.4. Muito obrigado!
trisweb

4
Trabalhou no Ubuntu 14.04.
horário de 7/10

1
Corrigido ao atualizar do Debian Wheezy (7.8) para Jessie (8) e do Nginx 1.2.1-2.2 para 1.6.2-5. Enorme agradecimento.
William Turrell

1
Pelo que entendi, ele diz ao fastcgi onde os arquivos são necessários. PATH_TRANSLATED pega o URI da solicitação e, em seguida, "converte" para onde o arquivo real está no servidor. Por exemplo. PATH_TRANSLATED para test.com/index.php pode ser /var/www/index.php
Constant Meiring

44

Muitos usuários se enquadram nesse segmento esperando encontrar uma solução para as páginas em branco serem exibidas ao usar nginx + php-fpm , sendo eu uma delas. Esta é uma recapitulação do que acabei fazendo depois de ler muitas das respostas aqui mais minhas próprias investigações (atualizadas no php7.2):

1) Abra /etc/php/7.2/fpm/pool.d/www.confe verifique o valor do parâmetro listen.

listen = /var/run/php/php7.2-fpm.sock

2) O parâmetro listendeve corresponder ao fastcgi_passparâmetro no arquivo de configuração do site (i, e /etc/nginx/sites-enabled/default:).

fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

3) Verifique se o arquivo realmente existe:

$ file /var/run/php/php7.2-fpm.sock 
/var/run/php/php7.2-fpm.sock: socket

4) Se não existir, isso significa que o php7.2-fpm não está sendo executado, então você precisa reiniciá-lo:

$ sudo /etc/init.d/php7.2-fpm restart
[ ok ] Restarting php7.2-fpm (via systemctl): php7.2-fpm.service.


Com relação à locationseção em /etc/nginx/sites-enabled/default:

   # pass PHP scripts to FastCGI server
   #
   location ~ \.php$ {
      include snippets/fastcgi-php.conf;

      # With php-fpm (or other unix sockets):
      fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
   }

Verifique se o arquivo snippets/fastcgi-php.confexiste no local /etc/nginx/:

$ file /etc/nginx/snippets/fastcgi-php.conf
/etc/nginx/snippets/fastcgi-php.conf: ASCII text

Este arquivo contém uma lista de definições de variáveis ​​requeridas pelo php7.2-fpm. As variáveis ​​são definidas diretamente ou através da inclusão de um arquivo separado.

 include fastcgi.conf;

Este arquivo está localizado em /etc/nginx/fastcgi.confe se parece com:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
...
fastcgi_param  REDIRECT_STATUS    200;

O nginx inclui dois arquivos de parâmetros possíveis: fastcgi_params e fastcgi.conf . A diferença entre ambos é a definição de variável SCRIPT_FILENAME:

$ diff fastcgi_params fastcgi.conf 
1a2
> fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

Para resumir uma longa história, o fastcgi.conf deve sempre funcionar. Se, por algum motivo, você estiver configurado usando fastcgi_params , defina SCRIPT_FILENAME:

location ~ \.php$ {
  include snippets/fastcgi-php.conf;

  # With php-fpm (or other unix sockets):
  fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

  fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
}

Agora recarregue a configuração do nginx:

$ sudo nginx -s reload

E verifique se um arquivo php é exibido corretamente. Por exemplo:

/var/www/html/test.php

<pre><?php var_export($_SERVER)?></pre>

Onde /var/www/htmlestá o caminho para a raiz do documento.

Se, apesar de tudo isso, você ainda estiver vendo um arquivo em branco, verifique se o seu arquivo php.inifoi short_open_tagativado (se você estiver testando uma página PHP com tags curtas).


1
Obrigado Diego! fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;Finalmente o truque.
usar o seguinte comando

O include fastcgi.conf ajudou a consertar tudo #
Rytis Lukoševičius

1
avaria impressionante! Eu estava faltando a configuração SCRIPT_FILENAME, este fez o trabalho
Herval

1
quando eu adicionei SCRIPT_FILENAME a essa configuração, novamente tudo falhou com "arquivo não encontrado"
holms

E a longa história, por que existem duas inclusões e uma não funciona imediatamente?
O Poderoso Chefão

24

Verifique se você tem isso em / etc / nginx / fastcgi_params

fastcgi_param SCRIPT_FILENAME $ request_filename;

Quem sabe por que isso ainda não está lá? A quantidade de tempo que isso deve desperdiçar coletivamente!


1
+1 Uma vantagem aparente de "fastcgi_param SCRIPT_FILENAME $ request_filename;" é diferente de "$ document_root / $ fastcgi_script_name", "$ request_filename" adapta o caminho à diretiva "alias" do Nginx. Veja: nginx.org/en/docs/http/ngx_http_core_module.html#variables , nginx.org/en/docs/http/ngx_http_core_module.html#alias e o blog de Martin Fjordvald citados por Levit acima ( blog.martinfjordvald.com/2013 / 04 /… ). No meu bloco de localização, ele resolveu o problema da página em branco com o php71-fpm e o Nginx instalado com o Homebrew no El Capitan.
Slack Undertow

15

Eu escrevi um programa C curto que retorna as variáveis ​​de ambiente passadas do nginx para o aplicativo fastCGI.

#include <stdlib.h>
#include <fcgi_stdio.h>
extern char **environ;

int main(int argc, char **argv) {
    char *envvar;
    int i;

    int count = 0;
    while(FCGI_Accept() >= 0) {
        printf("Content-type: text/html\n\n"
               "<html><head><title>FastCGI Call Debug Tool</title></head>\n"
               "<body><h1>FastCGI Call Debugging Tool</h1>\n"
               "<p>Request number %d running on host <i>%s</i></p>\n"
               "<h2>Environment Variables</h2><p>\n",
              ++count, getenv("SERVER_NAME"));
        i = 0;
        envvar = environ[i];
        while (envvar != NULL) {
                printf("%s<br/>",envvar);
                envvar = environ[++i];
        }
        printf("</p></body></html>\n");
    }
    return 0;
}

Salve isso em um arquivo, por exemplo fcgi_debug.c

Para compilá-lo, primeiro instale gcce libfcgi-dev, em seguida, execute:

gcc -o fcgi_debug fcgi_debug.c -lfcgi

Para executá-lo, instale spawn-fcgie execute:

spawn-fcgi -p 3000 -f /path/to/fcgi_debug

Então, mude sua configuração do nginx fcgi para apontar para o programa de depuração:

fastcgi_pass  127.0.0.1:3000;

Reinicie o nginx, atualize a página e todos os parâmetros aparecerão no seu navegador para você depurar! :-)


1
Observe que você precisa de cabeçalhos e spawn-fcgi. No Debian / Ubuntu você pode obtê-lo apt-get install spawn-fcgi libfcgi-dev.
pevik

8

Essas dicas me ajudaram na instalação do Ubuntu 14.04 LTS,

Além disso, eu precisava para ligar o short_open_tagno/etc/php5/fpm/php.ini

$ sudo kate /etc/php5/fpm/php.ini

short_open_tag = On

$ sudo service php5-fpm restart
$ sudo service nginx reload

Isso foi corrigido pela instalação do Ubuntu do DO droplet. Obrigado
Andrew

Isso foi corrigido para mim depois de instalar o nginx 1.9.4
Ajeeb.KP

6

Adicione isto em /etc/nginx/conf.d/default.conf:

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
Você se importaria em fornecer um pouco mais de detalhes sobre o que exatamente é o problema do OP e como sua resposta resolve o problema do OP?
precisa saber é o seguinte

1
Isso resolveu o mesmo problema para mim no Ubuntu 15.04 com o nginx 1.8.0 e o php-fpm 5.6.4-4ubuntu6. Gostaria muito de saber o que isso está realmente fazendo e por que não está incluído no arquivo de configuração nginx padrão, mas estou feliz que tenha o codificado em um Dockerfile.
James Williams

Colocar o valor no /etc/nginx/fastcgi_paramsarquivo seria mais adequado, eu acho.
Arda

4

Caso alguém tenha esse problema, mas nenhuma das respostas acima resolva seus problemas, eu estava tendo o mesmo problema e tive mais dificuldade em localizá-lo, pois meus arquivos de configuração estavam corretos, meus trabalhos ngnix e php-fpm estavam funcionando bem, e não houve erros nos logs de erros.

Erro idiota, mas nunca verifiquei a variável Short Open Tag no meu arquivo php.ini que foi definido como short_open_tag = Off. Desde que meus arquivos php estavam usando em <?vez de <?php, as páginas estavam aparecendo em branco. O Open Tag curto deveria ter sido definido como Onno meu caso.

Espero que isso ajude alguém.


2

A razão pela qual esse problema ocorre é que as configurações do fastcgi no nginx não funcionam conforme necessário e, no local ou no processamento, elas respondem como dados html. Existem duas maneiras possíveis de configurar o seu nginx para evitar esse problema.

  1. Método 1:

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # With php5-fpm:
                fastcgi_pass unix:/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi.conf;
        }
  2. Método 2:

    location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            include snippets/fastcgi-php.conf;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
    }

Ambos os métodos funcionariam corretamente; você pode prosseguir e usar qualquer um deles. Eles quase realizam as mesmas operações com uma diferença muito pequena.


1
location ~ [^/]\.php(/|$) {
         fastcgi_pass unix:/PATH_TO_YOUR_PHPFPM_SOCKET_FILE/php7.0-fpm.sock;
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}

Boa sorte


0

Nenhuma das respostas acima funcionou para mim - o PHP estava processando corretamente tudo, exceto as páginas que dependiam do mysqli, para as quais estava enviando uma página em branco com um código de resposta 200 e não gerando erros. Como estou no OS X, a correção foi simplesmente

sudo port install php56-mysql

seguido por uma reinicialização do PHP-FPM e nginx.

Eu estava migrando de uma configuração antiga do Apache / PHP para o nginx e não percebi a incompatibilidade de versão no driver para php-mysqle php-fpm.


0

Eu tive um problema semelhante, o nginx estava processando uma página no meio do caminho e depois parando. Nenhuma das soluções sugeridas aqui estava funcionando para mim. Corrigi-o alterando o buffer nginx fastcgi:

fastcgi_max_temp_file_size 0;

fastcgi_buffer_size 4K;
fastcgi_buffers 64 4k;

Após as alterações, meu locationbloco parecia:

location ~ \.php$ {
    try_files $uri /index.php =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_max_temp_file_size 0;
    fastcgi_buffer_size 4K;
    fastcgi_buffers 64 4k;
    include fastcgi_params;
}

Para obter detalhes, consulte https://www.namhuy.net/3120/fix-nginx-upstream-response-buffered-temporary-file-error.html


0

Se você estiver recebendo uma tela em branco, isso pode ser devido a 2 razões:

  1. Navegador impedindo a exibição dos quadros. Em alguns navegadores, os quadros são considerados inseguros. Para superar isso, você pode iniciar a versão sem moldura do phpPgAdmin

    http://-your-domain-name-/intro.php

  2. Você ativou um recurso de segurança no Nginx for X-Frame-Options e tente desativá-lo.


0

Isso resolveu meu problema:

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include snippets/fastcgi-php.conf;
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
}

0

Este é o meu vhost para UBUNTU 18.04 + apache + php7.2

server {
    listen 80;
    server_name test.test;
    root /var/www/html/{DIR_NAME}/public;
    location / {
        try_files $uri /index.php?$args;
    }
location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    }
}

A última linha a torna diferente das outras respostas.


2
há uma resposta aceita com mais de 200 votos - a questão é de 5 anos .. Eu pessoalmente não vejo esta resposta adicionando um monte para a pergunta ..
treyBake

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.