nginx 显示空白 PHP 页面

Posted

技术标签:

【中文标题】nginx 显示空白 PHP 页面【英文标题】:nginx showing blank PHP pages 【发布时间】:2013-03-03 15:24:18 【问题描述】:

我已经用 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"

【问题讨论】:

显然 php-fpm 没有被 nginx 调用,你检查过 nginx 的错误日志吗? 查看我上面的更新。 nginx 错误connect() failed ... fastcgi://127.0.0.1:9000与你的 nginx 配置冲突,重新加载 nginx 配置? 我认为这是对的。 我真的很惊讶这似乎只会影响地球上的几千人,因为即使是默认的 nginx+php 配置也会导致这种情况。 【参考方案1】:

替换

include fastcgi_params;

include fastcgi.conf;

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

【讨论】:

这为我解决了问题。 .conf_params 中缺少一个额外的配置参数。 这个(当然还有/etc/init.d/nginx restart)也在 2014 年 9 月 10 日升级 nginx 后在 Debian 测试中为我修复了它。 在将 nginx 更新到 1.6.2(2014 年 9 月更新)后,这也为我修复了它。必须喜欢随机破坏事物的更新。 这是fastcgi_paramsfastcgi.conf 的背景故事:blog.martinfjordvald.com/2013/04/… 这段代码不起作用——我不知道为什么;这段代码有效,我不知道为什么。你救了我几个小时。【参考方案2】:

作为参考,我附上了我的 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 用户读取。

【讨论】:

您的解决方案是其中的一部分。另一部分在这里wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm “SCRIPT_FILENAME”的最后一行对我有用 :) 谢谢 谢谢,最后一行成功了(使用 Centos 附带的 1.0 版本的 nginx 时不需要它)。我很乐意看到所有这些改进的文档。 不客气,很高兴知道这些年来它仍然对人们有所帮助。但是,请注意下面@spacepile 的更新答案,这可能会更好。 我遇到了同样的问题,我的解决方案是按照此处所述添加 SCRIPT_FILENAME(不带斜杠 /)。但是让我发疯的是为什么我真的需要这样做?我们安装了另一个 nginx(早于 1.9),并且不需要这条线。我找到了这个nginx.com/resources/wiki/start/topics/examples/phpfcgi,如果你将它与你的 fastcgi_params 进行比较,你会发现它很可能与列出的在线版本不同,你会发现 SCRIPT_FILENAME 不在其中。为什么?去图...【参考方案3】:

也遇到了这个问题,终于找到了解决办法here。简而言之,您需要将以下行添加到您的 nginx fastcgi 配置文件(Ubuntu 12.04 中的 /etc/nginx/fastcgi_params)

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

【讨论】:

非常感谢,这已在 Ubuntu 12.04 LTS 上修复。 在升级 nginx 1.5.4 -> 1.7.4 后也为我修复。非常感谢! 在 Ubuntu 14.04 上工作。 从 Debian Wheezy (7.8) 升级到 Jessie (8) 以及从 Nginx 1.2.1-2.2 升级到 1.6.2-5 时已修复。非常感谢。 据我了解,它告诉 fastcgi 需要提供的文件在哪里。 PATH_TRANSLATED 获取请求 URI,然后将其“翻译”成实际文件在服务器上的位置。例如。 test.com/index.php 的 PATH_TRANSLATED 可能是 /var/www/index.php【参考方案4】:

许多用户都陷入了这个线程,希望找到在使用 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 参数匹配(即:/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.

关于/etc/nginx/sites-enabled/default中的location部分:

   # 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.ini 启用了 short_open_tag(如果您正在测试带有短标签的 PHP 页面)。

【讨论】:

谢谢迭戈! fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 终于成功了。 包含 fastcgi.conf 帮助解决了这一切 真棒崩溃!我错过了 SCRIPT_FILENAME 配置,这使它工作 当我将 SCRIPT_FILENAME 添加到该配置中时,一切都再次失败并显示“找不到文件” 长话短说,为什么有两个包含,一个不能开箱即用?【参考方案5】:

确保你在 /etc/nginx/fastcgi_params 中有这个

fastcgi_param SCRIPT_FILENAME $request_filename;

谁知道为什么现在还没有这个?这必须共同浪费的时间!

【讨论】:

+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#variables、nginx.org/en/docs/http/ngx_http_core_module.html#alias 和上面 Levit 引用的 Martin Fjordvald 的博客 (blog.martinfjordvald.com/2013/04/…)。在我的位置块中,它解决了在 El Capitan 上使用 Homebrew 安装的 php71-fpm 和 Nginx 的空白页问题。 天哪!太牛了,然后这一行就解决了。【参考方案6】:

我写了一个简短的 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,刷新页面,你应该可以看到所有的参数出现在你的浏览器中,供你调试! :-)

【讨论】:

注意,你需要 headers 和 spawn-fcgi。在 Debian/Ubuntu 上,您可以通过 apt-get install spawn-fcgi libfcgi-dev 获得它。【参考方案7】:

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

另外我需要打开/etc/php5/fpm/php.ini中的short_open_tag

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

short_open_tag = On

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

【讨论】:

这由 DO droplet Ubuntu 安装修复。谢谢 安装 nginx 1.9.4 后为我解决了这个问题【参考方案8】:

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

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

【讨论】:

您介意提供更多关于 OP 的问题到底是什么以及您的答案如何解决 OP 的问题的详细信息吗? 这为我在 Ubuntu 15.04 上使用 nginx 1.8.0 和 php-fpm 5.6.4-4ubuntu6 解决了同样的问题。我很想知道这实际上在做什么以及为什么它不包含在默认的 nginx 配置文件中,但我至少很高兴我现在已经将它编码在 Dockerfile 中。 我认为将值放在/etc/nginx/fastcgi_params 文件中会更合适。【参考方案9】:

如果有人遇到这个问题,但以上答案都没有解决他们的问题,我遇到了同样的问题并且最难追踪它,因为我的配置文件是正确的,我的 ngnix 和 php-fpm 作业正在运行很好,并且没有通过任何错误日志出现错误。

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

希望这对某人有所帮助。

【讨论】:

【参考方案10】:

出现这个问题的原因是因为nginx中的fastcgi配置没有按要求运行,就位或处理,它们以html数据响应。有两种可能的方法可以配置您的 nginx 来避免这个问题。

    方法一:

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

    方法二:

    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;
    
    

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

【讨论】:

【参考方案11】:
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;

祝你好运

【讨论】:

【参考方案12】:

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

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

【讨论】:

有一个接受了 200 多票的答案 - 这个问题已有 5 年历史了。我个人认为这个答案并没有给这个问题增加很多..【参考方案13】:

以上答案都对我不起作用 - PHP 可以正确渲染除了依赖 mysqli 的页面之外的所有内容,它正在发送一个带有 200 响应代码的空白页面并且没有抛出任何错误。因为我在 OS X 上,所以修复很简单

sudo port install php56-mysql

随后重启 PHP-FPM 和 nginx。

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

【讨论】:

【参考方案14】:

我遇到了类似的问题,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

【讨论】:

【参考方案15】:

如果你得到一个空白屏幕,那可能是因为两个原因:

    浏览器阻止框架显示。在某些浏览器中,框架被认为是不安全的。为了克服这个问题,您可以通过

    启动无框架版本的 phpPgAdmin

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

    您已在 Nginx 中为 X-Frame-Options 启用了一项安全功能,请尝试禁用它。

【讨论】:

【参考方案16】:

这解决了我的问题:

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;

【讨论】:

【参考方案17】:

我遇到了类似的错误,但与 Nextcloud 结合使用。因此,如果这不起作用,请尝试: 看看the Nginx manual。

【讨论】:

以上是关于nginx 显示空白 PHP 页面的主要内容,如果未能解决你的问题,请参考以下文章

PHP返回页面空白原因分析-Nginx+PHP

PHP代码错误导致PHP返回页面空白

PHPMyAdmin/setup 显示空白屏幕,而 PMA 本身工作

php页面显示空白

为啥IIS打开PHP页面是空白

记一次安装Nginx+php-fpm安装后无法解析.php文件,状态码200,但显示空白页