Nginx Laravel框架网站 报错 500

案例:网站迁移,nginx 报500错误
架构 LNMPR (php 7.2.32 mysql 5.5.62 nginx 1.18.0 Redis 5.0.5) 网站是laravel 框架
上传网站备份到测试服务器上,解压。
mkdir -p /home/wwwroot/default/OA_online
tar zxf oa20200910.tar.gz -C /home/wwwroot/default/OA_online/
cd /home/wwwroot/default/OA_online/

删除配置的缓存文件
php artisan config:clear

清除路由缓存文件
php artisan route:clear
打开IE浏览器进行访问:http://192.168.189.199

报500错误



解决方法:
1、测试是否能正常解析:
cd /home/wwwroot/default/OA/public ##nginx ,root后面写的目录
vim index.php




说明 服务器可以正常解析。

2、接下来,把php.ini 调试模式打开
vim /usr/local/php/etc/php.ini

display_error = Off 改为 On
systemctl restart php-fpm
重新打开IE,http://192.168.189.199,查看php 报错信息。



发现是nginx 在跳转目录或者说引用目录 这里不成功。
就是index.php中 不能跳转到 /home/wwwroot/default/OA_online/vendor

3、修改nginx 配置文件:
cd /usr/local/nginx/conf
vim fastcg.conf


也可以不用删除:


systemctl restart nginx
4、重新打开IE 访问:http://192.168.189.199


++++++++++++++++++++++++++++++++++++++++++
open_basedir介绍
将php 所能打开的文件限制在指定的目录树中,包括文件本身,当程序要使用,例如fopen()或file_get_contents()打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。

php为了安全性考虑, open_basedir 的设置可以在几个地方设置。

首先 在php.ini中配置。
;open_basedir =

如果发现配置项前是有分号,表明php.ini中没有该设置。
那就很可能是在 nginx 中的 /usr/local/nginx/conf/fastcgi.conf中配置了。



多个路径直接分号隔开。
++++++++++++++++++++ 简单分析:
根据前面的php 报错提示:index.php 文件里面有问题


open_basedir restriction in effect. (open_basedir限制生效。)



就是,index.php 请求 /../vendor/autoload.php 不成功,因为open_basedir 限制生效(当文件在指定的目录树之外,程序将拒绝打开。),所以不成功。

也就是说,index.php 要去请求 /../vendor/autoload.php ,它要在那里去找呢,它会去找open_badedir 设置的目录里面
,[这里 /../ 其实就是 open_basedir设置的目录]

前面说了open_basedir有两个地方可以设置php.ini 里面,还有就是fastcgi.conf里面

默认php.ini 里面没有设置,index.php 去请求 /../vendor/autoload.php,就只能去找fastcgi.conf 里面
而fastcgi.conf 里面设置的目录位置如果找不到,则 index.php 请求失败,返回错误代码。如果能找到,正常显示。



这时可以修改fastcgi.conf ,把 open_basedir真正的目录写在后面,即可解决上面的问题


++++++++++++++++++++++++++++++++++

还有一种办法:直接把这一行注释或者删除。
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";

如果fastcgi.conf 里面open_basedir 有设定值


index.php 在请求/../vendor/autoload.php 时 会先去找这里面的目录,找得到就正常显示,找不到,就报错,也不再去网站目录找。
如果这两个地方都没有设置open_basedir的值,直接去网站主目录里找。所以,直接在fastcgi.conf 里面,删除这一行,也可以解决上面的问题。