2015年4月

nginx+php页面空白

今天在Ubuntu上遇到一个诡异的问题,机器用apt-get安装了nginx和php5,在sites-enabled下添加了一个本地网站的配置:监听80端口,设置server_name,location / {}也做了入口指向,location ~ .php$ {}里面也配置了 fastcgi_pass unix:/var/run/php5-fpm-event.sock;,由于配置了很多次nginx了,所以这块自认为也没有什么问题。然后就是php-fpm的配置了:单独建立了一个php-fpm的pool,通过unix socket和nginx进行通信,然后重启了nginx和php5-fpm,然后浏览器打开绑定了本地hosts的一个域名,发现一片空白,如下:
2015-04-16 17:19:35屏幕截图.png

其实index.php页面就写了一行phpinfo(),应该不会是一片空白啊,肯定是某个地方出错了。
首先我想到的是ubuntu apt-get安装的php禁用了phpinfo(),于是在命令行里面用php index.php执行这个文件,没有问题,看php.ini的配置也是正确的,所以排除;然后又怀疑nginx root的路径指错了,再回去检查nginx的配置文件,结果路径没有错,路径错了页面应该是404啊,我设置了404跳转,所以也不是404,再看location的正则!-e $request_filename rewrite ^/(.*)$ /index.php last;,大概这两句,检查没有问题啊,正则是正确的啊;然后我又怀疑是php-fpm没有启动起来,php5-fpm-event.sock,没有建立起来,所以我去查看了这个文件,发现存在啊,所以问题也不在这里;所以我再去看nginx的error_log,发现什么都没有,把错误日志的级别改到info级别,还是没有任何错误日志,这可奇怪了。。。nginx和php-fpm的通信貌似不存在任何问题;所以我接着去看了php-fpm.log,发现也没有任何问题,没有报错,来来去去的折腾了好一会儿,没有找到问题。

没办法,还是看请求吧,上面的图,状态码:200 ,size:0Kb,所以我想,页面空白不是我上面想到的那些问题,我再打开请求的详情:
2015-04-16 17:38:39屏幕截图.png

Server: "nginx/1.6.2 (Ubuntu)" 说明请求是经由nginx成功处理的,再看 X-Powered-By:"PHP/5.5.12-2ubuntu4.3" 说明请求也经过了php的处理,那么现在就可以讲上面那些猜测的错误推翻了,实际上没看到错误日志也应正了不是上面想到的那些错误,因为整个流程是正确的。

那么问题到底处在哪里呢?为什么是为空白?

首先要相信,index.php的phpinfo()绝对不会输出空白,到底为什么会空白呢?那么我们可以逆推,首先是可能php-fpm并没有执行到index.php,再往前推,有可能是nginx没有告诉php-fpm要执行哪个php脚本文件,再往前推,我们浏览器没有告诉nginx要执行哪个php脚本。问题肯定出现在这3个步骤里面。

那么我先检查了nginx的访问日志access-log,发现请求里有记录 /index.php,说明我们对nginx的请求是正确的,依次检查第二个步骤:我们知道nginx是通过 fastcgi协议和php通信的,所有的请求参数传递都是通过fastcgi_param指令传个php-fpm的,这些参数在php的超全局变量$_SERVER里面都可以看见,那么SCRIPT_FILENAME这个值有没有有没有传给php-fpm呢?由于nginx的fastcgi参数管理是放在一个叫做fastcgi_params的文件里单独管理,用主配置文件nginx.conf包含进来的,所以打开fastcgi_params检查,发现没有传递'SCRIPT_FILENAME'这一个参数,我尝试在最后一行加入了
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; ,然后重启nginx,刷新浏览器,我靠,爱情来的太快就像龙卷风,phpinfo()的内容出来了。问题居然能出现在这里??为啥php没有收到执行哪个脚本的参数,为毛不记错误日志不报错?这不是坑爹么?

吐槽归吐槽,问题好歹解决了,以后遇到类似的问题也能知道怎么解决了。所以在blog上mark一记!