显示空白PHP页面的nginx

我用php5-fpmbuild立了一个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" 

作为参考,我附加了我的location块捕获与.php扩展名的.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 …

也有这个问题,最后在这里find了解决办法。 简而言之,您需要将以下行添加到您的nginx fastcgiconfiguration文件(Ubuntu 12.04中的/ etc / nginx / fastcgi_params)

 fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name; 

许多用户在这个线程期待find一个解决scheme,使用nginx + php5-fpm显示空白页,我就是其中之一。 这是我阅读了许多答案后,加上我自己的调查结果做的回顾:

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

 location = /var/run/php5-fpm.sock 

2)参数location应该与nginx.conf文件中的fastcgi_pass参数相匹配。

 fastcgi_pass unix:/var/run/php5-fpm.sock; 

3)检查文件实际存在:

 $ file /var/run/php5-fpm.sock /var/run/php5-fpm.sock: socket 

4)如果它不存在,这意味着php5-fpm没有运行,所以你需要重新启动它:

 $ sudo /etc/init.d/php5-fpm restart [ ok ] Restarting php5-fpm (via systemctl): php5-fpm.service. 

关于location部分:

 location ~ \.php$ { include fastcgi_params; # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; } 

检查文件fastcgi_params存在于/etc/nginx/位置:

 $ file /etc/nginx/fastcgi_params /etc/nginx/fastcgi_params: ASCII text 

通常这个文件包含php5-fpm所需的variables定义列表:

 fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; ... fastcgi_param REDIRECT_STATUS 200; 

nginx包含两个可能的参数文件: fastcgi_paramsfastcgi.conf 。 两者的区别在于variablesSCRIPT_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 fastcgi_params; # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } 

现在重新加载nginxconfiguration:

 $ sudo nginx -s reload 

并检查一个PHP文件显示正确。 例如:

/var/www/html/test.php

 <pre><?php var_export($_SERVER)?></pre> 

其中/var/www/html是文档根目录的path。

确保你已经在/ etc / nginx / fastcgi_params中得到了这个

fastcgi_param SCRIPT_FILENAME $ request_filename;

谁知道为什么这不是已经存在? 这个时间总要浪费了!

我写了一个简短的C程序,它返回从nginx传递给fastCGI应用程序的环境variables。

 #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 fcgiconfiguration指向debugging程序:

 fastcgi_pass 127.0.0.1:3000; 

重新启动nginx,刷新页面,你应该看到所有参数出现在浏览器中供你debugging! 🙂

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

另外我需要打开/etc/php5/fpm/php.inishort_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; 

如果有人遇到这个问题,但以上答案都不能解决他们的问题,我有这个相同的问题,并最难追查下来,因为我的configuration文件是正确的,我的ngnix和php-fpm作业运行良好,通过任何错误日志都没有错误。

愚蠢的错误,但我从来没有检查我的php.ini文件中设置为short_open_tag = Off的Short Open Tagvariables。 由于我的PHP文件正在使用<? 而不是<?php ,页面显示空白。 短打开标签应该已经设置为On在我的情况。

希望这有助于某人。

发生此问题的原因是因为nginx中的fastcgiconfiguration没有按要求运行,而是在位置或处理中,它们作为html数据进行响应。 有两种可能的方式来configuration你的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; } 

这两种方法都能正常工作,你可以继续采取任何一种方法。 他们几乎执行相同的操作,只有很less的区别。

上述答案都不适用于我 – PHP正确地呈现除了依赖mysqli的页面之外的所有东西,为此它发送了一个带有200响应代码的空白页面,并且不会引发任何错误。 由于我在OS X上,修复很简单

sudo port install php56-mysql

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

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

我有一个类似的问题,nginx正在处理一个页面,然后停下来。 这里build议的解决scheme都没有为我工作。 我通过更改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

如果您屏幕空白,可能是因为2个原因:

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

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

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

这是解决我的问题

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