【问题标题】:nginx showing blank PHP pagesnginx 显示空白 PHP 页面
【发布时间】: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 配置也会导致这种情况。

标签: 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;

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

【讨论】:

【解决方案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 来避免这个问题。

    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. 方法二:

      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】:

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

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

              启动无框架版本的 phpPgAdmin

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

            2. 您已在 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

                【讨论】:

                  猜你喜欢
                  • 2018-03-05
                  • 1970-01-01
                  • 2016-01-22
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-11-26
                  相关资源
                  最近更新 更多