nginx显示空白的PHP页面

时间:2013-03-15 02:02:43

标签: nginx php

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

17 个答案:

答案 0 :(得分:315)

替换

include fastcgi_params;

include fastcgi.conf;

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

答案 1 :(得分:232)

作为参考,我附加了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用户存在并可读。

答案 2 :(得分:52)

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

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

答案 3 :(得分:33)

许多用户都希望在使用 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_params fastcgi.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页面)。

答案 4 :(得分:19)

确保你在/ etc / nginx / fastcgi_params

中有这个
  

fastcgi_param SCRIPT_FILENAME $ request_filename;

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

答案 5 :(得分:14)

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

答案 6 :(得分: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

答案 7 :(得分:5)

/etc/nginx/conf.d/default.conf

中添加此内容
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

答案 8 :(得分:3)

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

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

希望这有助于某人。

答案 9 :(得分: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;
    }
    
  3. 这两种方法都能正常工作,您可以继续使用其中任何一种方法。他们几乎执行相同的操作,但差别很小。

答案 10 :(得分:0)

上述答案都不适用于我 - PHP正确呈现除了依赖于mysqli的页面之外的所有内容,因为它发送了一个带有200响应代码的空白页而不会抛出任何错误。就像我在OS X上一样,修复只是

sudo port install php56-mysql

然后重启PHP-FPM和nginx。

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

答案 11 :(得分: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

答案 12 :(得分:0)

如果您出现空白屏幕,可能是由于两个原因:

  1. 浏览器阻止显示帧。在某些浏览器中,帧被认为是不安全的。要解决这个问题,您可以通过

    启动无框架版本的phpPgAdmin

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

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

答案 13 :(得分: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;
}

答案 14 :(得分: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;
    }
}

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

答案 15 :(得分:0)

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

祝你好运

答案 16 :(得分:0)

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