在将TP5上线到Linux下的lnmp环境,遇到的一个问题,页面一直是500错误。
本地开发是在windows下的WAMP环境,线上是Linux用一键安装包安装的LNMP环境。
TP5框架的应用入口文件是在/public/index.php, 于是我在index.php中加入错误提示信息,代码如下:
ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT);
打开页面看,还是依然报500错误,并没有给出错误信息,一顿百度之下,找到一个可以报错误信息的方法。在public下新建一个与index.php同级的php文件,在此我建了一个test.php,其中代码如下:
<?php ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT); include 'index.php';
再次打开页面,手动在url后面拼上/test.php,出现如下图所示错误
百度翻译了一下,大体意思就是 open_basedir限制效应,不允许的访问路径,没有开放等。于是又百度了一番,发现很多人的解答都提到了在《ThinkPHP5.0完全开发手册》这问题的解决方法,于是找到手册进行查询。手册中的说法如下图:
手册中提供的解决方法是将权限作用域由public下入口文件修改为框架根目录去(具体修改方法请参考《ThinkPHP5.0完全开发手册》,大约在456页左右),我试了下,确实可行。但是将入口文件从public拿出来后,所有的css,js以及上传图片等路径就需要重新修改,可谓牵一发而动全身。于是放弃了修改入口文件的解决方法。
重新回到open_basedir上,百度了下它的作用是"将用户可操作的文件限制在某目录下",它限制只能访问到框架的根目录下,不能访问public下,那去掉这个open_basedir,不就一切迎刃而解了?
于是找到了open_basedir出现的两个位置。一个是在php.ini中,路径为 /usr/local/php/etc/php.ini,出现的代码如下:
此处一直是注释的并不起作用。
第二个出现open_basedir是在nginx的配置中,路径是 /usr/local/nginx/conf/fastcgi.conf,代码如下:
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
这句代码起作用,将目录权限限制了,于是在前面加上 # 注释掉,然后保存修改。
最后重启lnmp。
折腾了好久的bug也算是完美解决掉了,顿时心情舒畅,想来,在用lnmp一键安装包安装时的环境选择有问题吧,才导致会多出这一行毒瘤吧。