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_params
与fastcgi.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_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 页面)。
【讨论】:
谢谢迭戈!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
要编译它,首先安装gcc
和libfcgi-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 文件使用的是 <?
而不是 <?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-mysql
和 php-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】:如果你得到一个空白屏幕,那可能是因为两个原因:
浏览器阻止框架显示。在某些浏览器中,框架被认为是不安全的。为了克服这个问题,您可以通过
启动无框架版本的 phpPgAdminhttp://-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 页面的主要内容,如果未能解决你的问题,请参考以下文章