nginx显示空白的PHP页面


164

我已经用php5-fpm设置了一个nginx服务器。当我尝试加载网站时,我得到一个空白页面,没有任何错误。HTML页面可以很好地服务,但不能使用PHP。我尝试在php.ini中打开display_errors,但是没有运气。php5-fpm.log不会产生任何错误,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;
    }
}

编辑

这是我的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
显然nginx没有调用php-fpm,您是否检查过nginx的错误日志?
adamsmith

检查上面的更新。
Mike Glaz 2013年

nginx错误connect() failed ... fastcgi://127.0.0.1:9000与您的nginx conf矛盾,请重新加载nginx conf?
adamsmith

我认为这是对的。
Mike Glaz 2013年

2
我真的很惊讶这似乎只影响地球上的数千人,因为即使默认的nginx + php配置也会导致此问题。
Sliq 2014年

Answers:


249

作为参考,我附加了location用于捕获.php扩展名为的文件的块:

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

仔细检查/path/to/fastcgi-params,并确保nginx用户可以看到它并且可以读取。


3
您的解决方案就是其中的一部分。另一部分在此处wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
Mike Glaz

153
最后一行'SCRIPT_FILENAME'对我
有用

3
谢谢您,最后一行成功了(使用Centos随附的nginx 1.0版本时不需要此功能)。我希望看到有关所有这些改进的文档。
Jorre 2014年

1
不客气,很高兴得知这些年来,它仍然可以帮助人们。但是,请注意下面@spacepile的更新答案,这可能更好。
朱利安·林

2
我遇到了同样的问题,对我来说,解决方案是按此处所述添加SCRIPT_FILENAME(不带斜杠/)。但是,令我发疯的是为什么我实际上需要这样做?我们进行了另一次nginx安装(低于1.9版),因此不需要此行。我发现了这个nginx.com/resources/wiki/start/topics/examples/phpfcgi,如果将它与fastcgi_params进行比较,您会发现它很可能与列出的在线版本不同,并且您会看到SCRIPT_FILENAME不在那里。为什么?去吧...
丹尼尔·迪米特洛夫

342

更换

include fastcgi_params;

include fastcgi.conf;

并在nginx.conf中删除fastcgi_param SCRIPT_FILENAME ...


17
这为我解决了。中.conf缺少一个额外的配置参数_params
恶意

7
在2014/etc/init.d/nginx restartnginx
。– severin

6
在将nginx更新为1.6.2(2014年9月更新)之后,这也为我修复。爱情更新会随机破坏事物。
Mahn 2014年

30
这里的背景故事fastcgi_paramsVS fastcgi.confblog.martinfjordvald.com/2013/04/...
利未人

4
该代码不起作用-我不知道为什么;该代码有效,我不知道为什么。你救了我几个小时。
亚历克斯(Alex)

54

也有这个问题,终于在这里找到解决方案。简而言之,您需要将以下行添加到您的nginx fastcgi配置文件(在Ubuntu 12.04中为/ etc / nginx / fastcgi_params)

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
非常感谢,此问题已在Ubuntu 12.04 LTS上修复。
Valentin Klinghammer'4

2
升级nginx 1.5.4-> 1.7.4后也为我修复。非常感谢!
trisweb 2014年

4
在Ubuntu 14.04上工作。
timetofly 2014年

1
从Debian Wheezy(7.8)升级到Jessie(8)以及从Nginx 1.2.1-2.2升级到1.6.2-5时修复。非常感谢。
威廉·特瑞尔

1
据我了解,它告诉fastcgi它需要服务的文件在哪里。PATH_TRANSLATED获取请求URI,然后将其“转换”为服务器上实际文件的位置。例如。test.com/index.php的PATH_TRANSLATED可能是/var/www/index.php
常数Meiring,2015年

44

很多用户都希望使用nginx + php-fpm时找到显示空白页面的解决方案,我就是其中之一。这是我在阅读了许多答案以及我自己的调查(更新为php7.2)后最终做的总结:

1)打开/etc/php/7.2/fpm/pool.d/www.conf并检查参数的值listen

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

2)参数listen应与fastcgi_pass您的站点配置文件(i,e :)中的参数匹配/etc/nginx/sites-enabled/default

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

3)检查文件是否实际存在:

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

4)如果不存在,则意味着php7.2-fpm没有运行,因此您需要重新启动它:

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


关于以下location部分/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;
   }

检查文件snippets/fastcgi-php.conf在以下位置是否存在/etc/nginx/

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

该文件包含php7.2-fpm所需的变量定义列表。可以直接定义变量,也可以通过包含单独文件来定义变量。

 include fastcgi.conf;

该文件位于,/etc/nginx/fastcgi.conf看起来像:

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

nginx包括两个可能的参数文件:fastcgi_paramsfastcgi.conf。两者之间的区别是变量的定义SCRIPT_FILENAME

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

长话短说,fastcgi.conf应该总是有效。如果由于某种原因您正在使用fastcgi_params,则应定义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;
}

现在重新加载nginx配置:

$ sudo nginx -s reload

并检查php文件是否正确显示。例如:

/var/www/html/test.php

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

/var/www/html文档根目录的路径在哪里。

尽管如此,如果仍然看到一个空白文件,请确保php.inishort_open_tag启用(如果您正在测试带有短标签的PHP页面)。


1
谢谢迭戈!fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;终于做到了。
危险89年

包含fastcgi.conf帮助修复了所有问题
RytisLukoševičius15年

1
很棒的故障!我错过了SCRIPT_FILENAME配置,这使它起作用了
herval 2015年

1
当我将SCRIPT_FILENAME添加到该配置后,一切都因“找不到文件”而失败
holms

从长远来看,为什么会有两个包含项,而其中一个不能立即使用呢?
教父

24

确保在/ etc / nginx / fastcgi_params中具有此权限

fastcgi_param SCRIPT_FILENAME $ request_filename;

谁知道为什么现在不存在?必须集体浪费的时间!


1
+1“ fastcgi_param SCRIPT_FILENAME $ request_filename;”的看似优势。与“ $ document_root / $ fastcgi_script_name”不同,“ $ request_filename”使路径适应Nginx的“ alias”指令。请参阅:nginx.org/en/docs/http/ngx_http_core_module.html#variablesnginx.org/en/docs/http/ngx_http_core_module.html#alias,马丁Fjordvald的博客引述莱维特以上(blog.martinfjordvald.com/2013 / 04 /…)。在我的位置栏中,它解决了El Capitan上php71-fpm和Nginx随Homebrew一起安装的问题。
Slack Undertow

15

我编写了一个简短的C程序,该程序将环境变量从Nginx传递给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;
}

将其保存到文件,例如 fcgi_debug.c

要进行编译,请先安装gcclibfcgi-dev,然后运行:

gcc -o fcgi_debug fcgi_debug.c -lfcgi

要运行它,请安装spawn-fcgi,然后运行:

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

然后,更改您的nginx fcgi配置,使其指向调试程序:

fastcgi_pass  127.0.0.1:3000;

重新启动nginx,刷新页面,您应该看到所有参数都出现在浏览器中供您调试!:-)


1
注意,您需要标头和spawn-fcgi。在Debian / Ubuntu上,您可以通过下载apt-get install spawn-fcgi libfcgi-dev
pevik

8

这些提示帮助我安装了Ubuntu 14.04 LTS,

此外,我需要转上short_open_tag/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

这由DO Drop Ubuntu安装修复。谢谢
安德鲁(Andrew)

在安装nginx 1.9.4
Ajeeb.KP 15/09 / 16,12

6

将此添加到/etc/nginx/conf.d/default.conf

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
您介意提供有关OP的确切问题以及您的答案如何解决OP的问题的更多详细信息吗?
wookie919 2014年

1
这在使用nginx 1.8.0和php-fpm 5.6.4-4ubuntu6的Ubuntu 15.04上为我解决了相同的问题。我很想知道这实际上是在做什么,以及为什么它不包含在默认的nginx配置文件中,但是至少令我满意的是,我现在已经将其编入了Dockerfile中。
詹姆斯·威廉姆斯

/etc/nginx/fastcgi_params我认为将值记录在文件中会更合适。
阿达(Arda)2015年

4

万一有人遇到了这个问题,但以上答案都不能解决他们的问题,我遇到了同样的问题,并且由于我的配置文件正确,我的ngnix和php-fpm作业运行正常而经历了最困难的时间没有错误通过任何错误日志。

愚蠢的错误,但我从未在php.ini文件中检查过设置为的Short Open Tag变量short_open_tag = Off。由于我的php文件使用<?而不是<?php,因此页面显示为空白。On在我的情况下,应该将Short Open Tag设置为。

希望这对某人有帮助。


2

发生此问题的原因是因为nginx中的fastcgi配置未按要求运行,并且在适当位置或未处理,它们作为html数据响应。您可以通过两种可能的方式配置nginx来避免此问题。

  1. 方法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. 方法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;
    }

两种方法都可以正常工作,您可以继续使用其中任何一种方法。他们几乎执行相同的操作,差别很小。


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

祝好运


0

上面的答案对我都不起作用-PHP正确地渲染了除依赖mysqli的页面以外的所有内容,为此它发送了一个包含200个响应代码的空白页面,并且没有引发任何错误。当我在OS X上时,解决方法很简单

sudo port install php56-mysql

然后重新启动PHP-FPM和nginx。

我正在从较旧的Apache / PHP安装程序迁移到nginx,但没有注意到php-mysqland 的驱动程序版本不匹配php-fpm


0

我有一个类似的问题,nginx正在中途处理一个页面,然后停止。这里建议的解决方案都没有对我有用。我通过更改nginx fastcgi缓冲来解决它:

fastcgi_max_temp_file_size 0;

fastcgi_buffer_size 4K;
fastcgi_buffers 64 4k;

更改之后,我的代码location块如下所示:

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

有关详细信息,请参见https://www.namhuy.net/3120/fix-nginx-upstream-response-buffered-temporary-file-error.html


0

如果屏幕变黑,可能是由于两个原因:

  1. 浏览器阻止显示框架。在某些浏览器中,框架被认为是不安全的。为了克服这个问题,您可以通过以下方式启动phpPgAdmin的无框架版本:

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

  2. 您已在Nginx中为X-Frame-Options启用了安全功能,请尝试将其禁用。


0

这解决了我的问题:

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

这是我的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;
    }
}

最后一行使其不同于其他答案。


2
有200票以上的公认答案-这个问题已有5年历史了。.我个人认为这个答案没有为这个问题增加太多..
treyBake

0

我有一个类似的错误,但与Nextcloud结合使用。因此,如果这不起作用,请尝试:看一下Nginx手册

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.