解决 Lnmp 1.4/1.5 (failed to open stream: Operation not permitted) open_basedir 的问题

阅读数: 2500 2019年01月03日

刚安装完 Lnmp 1.5 ,运行 Laravel 5.4 发现访问不了,之前用 Lnmp 1.2/1.3 一直没问题,怎么回事呢。

定位问题:
1、 查看错误日志,根据 nginx 配置的 error_log 找到错误日志;
2、发现这段错误:
2019/01/03 13:34:53 [error] 23051#0: *9 FastCGI sent in stderr: "PHP message: PHP Warning:  require(): open_basedir restriction in effect. File(/xx/x/xx/autoload.php) is not within the allowed path(s): (/x/x/x/x/x/:/tmp/:/proc/) in /x/x/x/x/xindex.php on line xx
3、查看 /usr/local/php/etc/php.ini ,里面的 open_basedir 并未开启啊;
4、搜索下找到,这是 Lnmp 自己设置的,查看 lnmp 的 faq,原来如此,解决方案:

LNMP 1.4上如果不想用防跨目录或者修改.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。


未了防止官方页面打不开,复制一份备用:

##防跨目录设置##
LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置

LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。

.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
删除的话rm -f /网站目录/.user.ini 就可以。
修改完成后再执行:chattr +i /网站目录/.user.ini
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!

LNMP 1.4上如果不想用防跨目录或者修改.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。

LNMP 1.4上也可以直接使用lnmp1.4/tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除。
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。


LNMPA或LAMP 模式1.2版本以上的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要设置可以在前面加 # 进行注释,或自行修改目录的限制。
重启apache生效。


参考资料
https://lnmp.org/faq/lnmp-vhost-add-howto.html#user.ini
https://zhuanlan.zhihu.com/p/69066842
phpriji.cn | 网站地图 | 沪ICP备17015433号-1