Laravel框架加载出错require(): open_basedir restriction in effect

举报
lxw1844912514 发表于 2022/03/27 01:47:40 2022/03/27
【摘要】 错误详情 Laravel运行环境 Linux Nginx **Warning**: require(): open_basedir restriction in effect. File(/home/wwwroot/ssmanager/vendor/autoload.php) is not within the allowed pat...

错误详情
Laravel运行环境 Linux Nginx


  
  1. **Warning**: require(): open_basedir restriction in effect. File(/home/wwwroot/ssmanager/vendor/autoload.php) is not within the allowed path(s): (/home/wwwroot/ssmanager/public/:/tmp/:/proc/) in **/home/wwwroot/ssmanager/public/index.php**on line **24**
  2. **Warning**: require(/home/wwwroot/ssmanager/vendor/autoload.php): failed to open stream: Operation not permitted in **/home/wwwroot/ssmanager/public/index.php** on line **24**
  3. **Fatal error**: require(): Failed opening required '/home/wwwroot/ssmanager/public/../vendor/autoload.php' (include_path='.:/usr/local/php/lib/php') in **/home/wwwroot/ssmanager/public/index.php** on line **24**

解决方法
找到Nginx中的fastcgi.conf配置文件,一般位于fastcgi.conf文件中

/usr/local/nginx/conf/fastcgi.conf
 

打开文件找到如下部分


  
  1. # PHP only, required if PHP was built with --enable-force-cgi-redirect
  2. fastcgi_param  REDIRECT_STATUS    200;
  3. fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";

将其$document_root变量修改为项目目录(或者删掉这行),例如我现在的项目是ssmanager(Laravel项目),只需将$document_root修改为ssmanager所在的目录。

fastcgi_param PHP_ADMIN_VALUE "open_basedir=/home/wwwroot/ssmanager/:/tmp/:/proc/";
 

 


  
  1. 重启Nginx服务器
  2. /etc/init.d/nginx restart


错误分析
fastcgi_param是什么
fastcgi_param属于ngx_http_fastcgi_module模块的参数,用于设置传给FastCgi服务器的参数及设置PHP配置项,其中包含用户访问IP等及一些其他的Webserver信息;通过PHP_ADMIN_VALUE选项可以给PHP进行配置

(自PHP 5.3.3 起,可以通过 web 服务器设置 PHP 的配置)PHP官方文档

fastcgi_param 语法:

名称    选项
Syntax    fastcgi_param parameter value [if_not_empty]
Default    -
Context    http, server, location
其中value可以包含文本,变量及其组合。仅当在当前级别上没有定义fastcgi_param指令时,定义的指令才可以从前一级继承。

下面列出一些常规参数,可以看出fastcgi_param的具体用法


  
  1. fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
  2. fastcgi_param  QUERY_STRING       $query_string;
  3. fastcgi_param  REQUEST_METHOD     $request_method;
  4. fastcgi_param  CONTENT_TYPE       $content_type;
  5. fastcgi_param  CONTENT_LENGTH     $content_length;
  6. fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
  7. fastcgi_param  REQUEST_URI        $request_uri;
  8. fastcgi_param  DOCUMENT_URI       $document_uri;
  9. fastcgi_param  DOCUMENT_ROOT      $document_root;
  10. fastcgi_param  SERVER_PROTOCOL    $server_protocol;
  11. fastcgi_param  REQUEST_SCHEME     $scheme;
  12. fastcgi_param  HTTPS              $https if_not_empty;
  13. fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
  14. fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
  15. fastcgi_param  REMOTE_ADDR        $remote_addr;
  16. fastcgi_param  REMOTE_PORT        $remote_port;
  17. fastcgi_param  SERVER_ADDR        $server_addr;
  18. fastcgi_param  SERVER_PORT        $server_port;
  19. fastcgi_param  SERVER_NAME        $server_name;
  20. # PHP only, required if PHP was built with --enable-force-cgi-redirect
  21. fastcgi_param  REDIRECT_STATUS    200;
  22. fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";


通过观察可以看出,我们在使用PHP中的$_SERVER[SERVER_ADDR]获取WEBSERVER相关参数时,其实就是与fastcgi_param的参数对应的。

在编译 PHP 时添加--enable-force-cgi-redirect选项,REDIRECT_STATUS和PHP_ADMIN_VALUE则会生效

PHP_ADMIN_VALUE
PHP_ADMIN_VALUE 为一个运行池传递附加的环境变量,或者更新 PHP 的配置值

在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。
还可以在为一个运行池传递附加的环境变量,或者更新 PHP 的配置值。PHP官方文档

可以得出 Nginx 通过制定 PHP_ADMIN_VALUE 来给 PHP 设定 open_basedir 配置项

OPEN_BASEDIR
open_basedir作用是将 PHP 所能打开的文件限制在指定的目录树中,包括文件本身。

当一个脚本试图用例如 fopen() 或者 gzopen() 打开一个文件时,该文件的位置将被检查。当文件在指定的目录树之外时 PHP 将拒绝打开它。所有的符号连接都会被解析,所以不可能通过符号连接来避开此限制。

其实open_basedir有些注意的地方

open_basedir 指定的限制实际上是前缀,不是目录名。也就是说“open_basedir = /dir/incl”也会允许访问“/dir/include”和“/dir/incls”,如果它们存在的话。如果要将访问限制在仅为指定的目录,用斜线结束路径名。例如:“open_basedir = /dir/incl/”

总结
知道了fastcgi_param,PHP_ADMIN_VALUE,open_basedir是什么,就可以知道问题出现在, Nginx 中使用 PHP_ADMIN_VALUE 配置了 PHP 的用于控制PHP自身能打开目录树的open_basedir选项,想要解决问题,可以通过指定对应目录树或者删除此配置即可(简单粗暴)。


open_basedir php授权目录设置

php为了安全性考虑,有一项 open_basedir 的设置。根据你web服务器环境,open_basedir可以在几个地方设置。

首先 在php.ini中配置。

;open_basedir =
 


fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root:/tmp/:/proc/:/you_web_path";  如果发现配置项前是有分号,表明php.ini中没有该设置。那就很可能是在  php-fpm  中的 fastcgi.conf中配置了。php-fpm中的配置会覆盖php.ini的配置。


  
  1. /you_web_path 是你要添加的让php可以访问的路径。多个路径直接分号隔开
  2. 如果也给服务器有多个项目,无论是在php.ini或者fastcgi.cong中设置,都是针对所有项目。那能不能只针对某个项目设置呢?
  3. 答案是肯定的。还可以在项目根目录中通过 .user.ini 进行配置。
  4. .user.ini配置
  5. 首先,要使.user.ini生效,要设置php.ini 中的

       
  1. user_ini.filename".user.ini"
  2. user_ini.cache_ttl = 300

  关于这两个配置的意义,请看php手册 http://php.net/manual/zh/configuration.file.per-user.php

注释掉 fastcgi.conf 中的 open_basedir  的配置。

在项目根目录 创建 .user.ini文件,写入如下内容

1

open_basedir=/tmp/:/proc/:/you_web_path

/you_web_path 是你要添加的让php可以访问的路径。多个路径直接分号隔开
 
重启一下php-fpm 服务即可。
 

测试中还发现这三个地方配置的优先级如下

“php.ini” > “nginx fastcgi fastcgi_param” > “php-fpm.conf”

php下open_basedir的配置

在下载了YII2.0框架并成功配置了nginx之后,发现还是无法访问,查看错误日志发现报错信息有中有

require(): open_basedir restriction in effect。

 

  遂去网上查找,后发现是php的配置项open_basedir限制了require()访问的路径。
  open_basedir 将php所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file_get_contents()打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。
  在linux系统中,open_basedir主要在php.ini和fastcgi.conf文件中配置,
  php.ini中配置如下:

open_basedir="指定目录"
 

  fastcgi.conf中配置如下:

fastcgi_param PHP_VALUE "open_basedir=指定目录"
 

  在windows下,主要在php.ini和apache的http.conf文件中配置,http.conf中配置如下:

php_admin_value open_basedir "指定目录"
 

  用open_basedir指定的限制实际上是前缀,不是目录名。 也就是说 open_basedir=/home/fdipzone 也会允许访问/home/fdipzone_abc,如果要将访问限制为目录,请使用斜线结束路径名,例如:open_basedir=”/home/fdipzone/”。如果要设置多个目录,window使用;分隔目录,linux使用:分隔目录。
  使用open_basedir可以限制程序可操作的目录和文件,提高系统安全性。但会影响I/O性能导致系统执行变慢,因此需要根据具体需求,在安全与性能上做平衡。

=====补充======

将网上找到的一些和502 Bad Gateway错误有关的问题和排查方法列一下,先从FastCGI配置入手:

1.查看FastCGI进程是否已经启动

NGINX 502错误的含义是sock、端口没被监听造成的。我们先检查fastcgi是否在运行

 

2.检查系统Fastcgi进程运行情况

除了第一种情况,fastcgi进程数不够用、php执行时间长、或者是php-cgi进程死掉也可能造成nginx的502错误
运行以下命令判断是否接近FastCGI进程,如果fastcgi进程数接近配置文件中设置的数值,表明worker进程数设置太少

 

netstat -anpo | grep "php-cgi" | wc -l


  
  1. server {
  2. listen 80;
  3. server_name evch.com;
  4. root /home/wwwroot/vevchatspace/public;
  5. # add_header X-Frame-Options "SAMEORIGIN";
  6. # add_header X-XSS-Protection "1; mode=block";
  7. # add_header X-Content-Type-Options "nosniff";
  8. index index.html index.htm index.php;
  9. charset utf-8;
  10. location / {
  11. try_files $uri $uri/ /index.php?$query_string;
  12. }
  13. location = /favicon.ico { access_log off; log_not_found off; }
  14. location = /robots.txt { access_log off; log_not_found off; }
  15. error_page 404 /index.php;
  16. # location ~ \.php$ {
  17. # fastcgi_split_path_info ^(.+\.php)(/.+)$;
  18. #fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
  19. # fastcgi_pass unix:/tmp/php-cgi.sock;
  20. # fastcgi_index index.php;
  21. # include fastcgi_params;
  22. #}
  23. #location ~ \.php(.*)$ {
  24. location ~ \.php$ {
  25. fastcgi_pass unix:/tmp/php-cgi.sock; #监听的是这个
  26. #fastcgi_pass 127.0.0.1:9000;
  27. fastcgi_index index.php;
  28. fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
  29. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  30. fastcgi_param PHP_VALUE open_basedir=/home/wwwroot/vevace/:/tmp/:/proc/; #这里加上这句
  31. #fastcgi_param PATH_INFO $1;
  32. fastcgi_param PATH_INFO $fastcgi_path_info;
  33. #fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  34. include fastcgi_params;
  35. }
  36. location ~ /\.(?!well-known).* {
  37. deny all;
  38. }
  39. }



链接:https://www.jianshu.com/p/a862ce3d13fb

参考:https://www.cnblogs.com/guohong-hu/p/9350076.html

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/105501773

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。