显示空白 PHP 页面的 nginx

我已经用 php5-fpm 设置了一个 nginx 服务器。当我尝试加载网站时,我得到一个没有错误的空白页面。HTML 页面可以正常使用,但 php 不行。我尝试在 php.ini 中打开 display _ error,但是没有成功。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"
156470 次浏览

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

更换

include fastcgi_params;

include fastcgi.conf;

并删除 nginx.conf 中的 fastcgi _ param SCRIPT _ FILENAME..

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

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

这些提示帮助我安装 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

/etc/nginx/conf.d/default.conf中添加以下内容:

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

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

如果有人遇到这个问题,但是上面的答案都没有解决他们的问题,那么我也遇到了同样的问题,而且我花了很长时间才找到它,因为我的配置文件是正确的,我的 ngnix 和 php-fpm 作业运行良好,并且没有错误通过任何错误日志传递过来。

这是个愚蠢的错误,但是我从来没有检查过 php.ini 文件中设置为 short_open_tag = Off的 Short Open Tag 变量。因为我的 php 文件使用的是 <?而不是 <?php,所以页面显示为空白。在我的情况下,短开标签应该被设置为 On

希望这对谁有帮助。

上面的答案对我来说都不管用—— PHP 正确地呈现了除了依赖 mysqli 的页面之外的所有内容,它发送了一个包含200个响应代码的空白页面,并且没有抛出任何错误。因为我在 OS X 上,修复很简单

sudo port install php56-mysql

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

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

许多用户在这个线程下希望找到一个解决方案的空白页显示,而使用 Nginx + php-fpm,我是其中之一。下面是我在阅读了这里的许多答案以及我自己的调查结果后所做的回顾(更新到 php7.2) :

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

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

参数 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.


关于 /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 _ paramsFast cgi.conf:

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

长话短说,Fast cgi.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 页面)。

确保您已经在/etc/nginx/fastcgi _ params 中得到了这个参数

Fastcgi _ param SCRIPT _ FILENAME $request _ filename;

谁知道为什么现在还没有呢? 这个时间的数量必须集体浪费!

发生此问题的原因是,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. Method 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;
    }
    

Both the methods would work properly, you can go ahead and take any one of them. They almost perform the same operations with a very few difference.

我有一个类似的问题,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

如果你的屏幕是空白的,这可能是由于两个原因:

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

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

  2. 你已经在 Nginx 启用了一个安全功能,可以尝试禁用它。

这解决了我的问题:

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

这是 UBUNTU 18.04 + apache + php7.2的 vhost

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

最后一行和其他答案不同。

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

祝你好运

我也犯过类似的错误,但是是和 Nextcloud 一起犯的: 看看 Nginx 手册

这些步骤解决了我的问题。

Nginx version: nginx/1.17.10 nginx 版本: nginx/1.17.10

Step1: 添加到 default.conf。请注意我使用的是7.4。如果您正在使用其他版本,请将 fastcgi _ pass unix 套接字路径更改为正确的 pgp 版本。

location ~ \.php$ {
root                    /var/www/html;
fastcgi_pass            unix:/run/php/php7.4-fpm.sock;
fastcgi_index           index.php;
include                 fastcgi_params;
fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

第二步: 将它们添加到 fastcgi _ params 中

fastcgi_param SCRIPT_FILENAME $request_filename;

第三步:

重新启动 nginx