ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## **防跨目录设置** 将lnmp的nginx配置文件中root设置为` /home/wwwroot/public/`后访问thinkphp提示`Warning: require(): open_basedir restriction in effect`这是因为lnmp默认开启了open_basedir的原因,如fopen()或file\_get\_contents()只能打开一个public文件夹类的文件,开始在nginx.conf没有找到open_basedir选项,然后在fastcgi.conf中找到了内容如下:`fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";` 由此可知$document_root就是我们在nginx.conf设置的root目录我们只能打开public里的文件,我们用#注释就可以了,由于在这台服务器上只部署了一个项目,且open_basedir会影响i/o,所以我们直接注释掉这段就好了 如果配置多个项目时 ` LNMP 1.1及之前的版本使用php.ini里面,[open\_basedir设置](http://www.vpser.net/security/lnmp-cross-site-corss-dir-security.html) LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open\_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。 .user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini 可以使用[winscp文件管理](https://www.vpser.net/manage/winscp.html)、[vim编辑器](http://www.vpser.net/manage/vi.html)或[nano编辑器](http://www.vpser.net/manage/nano.html)进行修改。 删除的话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或更高版本也可以直接使用lnmp安装包 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参数进行设置。如果不需要防跨目录设置可以在 php\_admin\_value open\_basedir 该行前面加 # 进行注释,或自行修改参数后面的目录。 重启apache生效。 # 说明 ## **1.open\_basedir介绍** 前言:前些日我用lnmp一键安装包出现了open\_basedir的问题,因为我把项目目录变了,所以要在的**fastcgi.conf**下面加上open\_basedir的目录 open\_basedir 将[PHP](http://lib.csdn.net/base/php "PHP知识库")所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file\_get\_contents()打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。 本指令不受安全模式打开或关闭的影响。  ## **2.open\_basedir设置方法** **1.在[php](http://lib.csdn.net/base/php "PHP知识库").ini 加入** ~~~ open_basedir="指定目录" ~~~ **2.在程序中使用** ~~~ ini_set('open_basedir', '指定目录'); ~~~ **3.在apache的httpd.conf中的Directory配置** ~~~ php_admin_value open_basedir "指定目录" ~~~ **httpd.conf中的VritualHost** ~~~ php_admin_value open_basedir "指定目录" ~~~ **4.nginx fastcgi.conf** ~~~ fastcgi_param PHP_VALUE "open_basedir=指定目录" ~~~ 用open\_basedir指定的限制实际上是前缀,不是目录名。  也就是说 open\_basedir=/home/fdipzone 也会允许访问/home/fdipzone\_abc,如果要将访问限制为目录,请使用斜线结束路径名,例如:open\_basedir=”/home/fdipzone/” 如果要设置多个目录,window使用;分隔目录,[Linux](http://lib.csdn.net/base/linux "Linux知识库")使用:分隔目录。 ## **3.使用open\_basedir限制目录访问** 首先创建一个VirtualHost,  设置open\_basedir 为/home/fdipzone/sites/in.fdipzone.com/ ~~~ <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /home/fdipzone/sites/in.fdipzone.com ServerName in.fdipzone.com php_admin_value open_basedir "/home/fdipzone/sites/in.fdipzone.com/" <Directory "/home/fdipzone/sites/in.fdipzone.com"> allow from all Options + Indexes </Directory> </VirtualHost> ~~~ 在上一层目录 /home/fdipzone/sites/ 中创建一个test.txt文件,在in.fdipzone.com中创建php执行以下代码 ~~~ <?php echo file_get_contents('../test.txt'); ?> ~~~ 因为test.txt不在限定的目录范围内,因此php提示警告  Warning: file\_get\_contents(): open\_basedir restriction in effect. File(../test.txt) is not within the allowed path(s): (/home/fdipzone/sites/in.fdipzone.com/) in /home/fdipzone/sites/in.fdipzone.com/index.php on line 3 ## **4.设置open\_basedir的性能分析** open\_basedir开启后会影响I/O,因为每个调用的文件都需要判断是否在限制目录内。 [测试](http://lib.csdn.net/base/softwaretest "软件测试知识库")程序,读取限制目录内同一文件10000次 ~~~ <?php // 记录开始时间 $starttime = getMicrotime(); // 读取10000次文件 for($i=0; $i<10000; $i++){ file_get_contents('test.txt'); } // 记录结束时间 $endtime = getMicrotime(); printf("run time %f ms\r\n", ((float)($endtime)-(float)($starttime))*1000); function getMicrotime(){ list($usec, $sec) = explode(' ', microtime()); return (float)$usec + (float)$sec; } ?> ~~~ **关闭open\_basedir测试**  run time 137.237072 ms **打开open\_basedir测试**  run time 404.207945 ms **开启open\_basedir后,执行时间是关闭的3倍。** **总结:** 使用open\_basedir可以限制程序可操作的目录和文件,提高系统安全性。但会影响I/O性能导致系统执行变慢,因此需要根据具体需求,在安全与性能上做平衡。